+ -
当前位置:首页 → 问答吧 → mov ecx,就支持到 unsigned logn了吗?要更大的如unsigned logn logn有没有可能?

mov ecx,就支持到 unsigned logn了吗?要更大的如unsigned logn logn有没有可能?

时间:2010-12-06

来源:互联网

mov ecx,就支持到 unsigned logn了吗?要更大的如unsigned logn logn有没有可能?

数字高达100亿,约10G,似乎只能用unsigned logn logn类型的了,但定义:


unsigned logn logn a=0;
mov ecx,a这里出错了

作者: kfrght   发布时间: 2010-12-06

64 位,要么在 64 位的 cpu 上使用 rcx 这样的寄存器;或者自己用内存或 32 位的寄存器对来进行数据的组织和运算了。WinAPI 也提供些个简单的 64 运行函数的,UInt32x32To64() 等。

作者: zara   发布时间: 2010-12-06

引用 1 楼 zara 的回复:
64 位,要么在 64 位的 cpu 上使用 rcx 这样的寄存器;或者自己用内存或 32 位的寄存器对来进行数据的组织和运算了。WinAPI 也提供些个简单的 64 运行函数的,UInt32x32To64() 等。


要支持类似这样的,用什么:

unsigned logn logn a=0;//演示值,实际值很大
mov ecx, a

作者: kfrght   发布时间: 2010-12-06

ecx 是 32 位,怎么能 long long 呢。可以自己用 ebx:ecx 这样的两个 32 位寄存器组对来操作 64 位的值

作者: zara   发布时间: 2010-12-06

引用 3 楼 zara 的回复:
ecx 是 32 位,怎么能 long long 呢。可以自己用 ebx:ecx 这样的两个 32 位寄存器组对来操作 64 位的值


zara大哥,小弟是新手,老大给个例子吧

作者: kfrght   发布时间: 2010-12-06

例子,简单些的比如两个 long long 相加:(a2+b2 -> c2)
  a2 dq ?
  b2 dq ?
  c2 dq ?
  ; ...
  mov ecx, dword ptr a2
  mov ebx, dword ptr a2[4]
  add ecx, dword ptr b2
  adc ebx, dword ptr b2[4]
  mov dword ptr c2, ecx
  mov dword ptr c2[4], ebx

作者: zara   发布时间: 2010-12-06

引用 5 楼 zara 的回复:
例子,简单些的比如两个 long long 相加:(a2+b2 -> c2)
a2 dq ?
b2 dq ?
c2 dq ?
; ...
mov ecx, dword ptr a2
mov ebx, dword ptr a2[4]
add ecx, dword ptr b2
adc ebx, dword ptr b2[4]
mov dword ……


太深奥了阿,弄不懂,老大能否帮我把这个转成支持64位的:


  void GetCRC32(
//const BYTE *pbData,//本来是这样的
  const short *pbData,//为支持64位改成这个
__int64 nSize
  ){
__asm
{
  MOV EAX, -1
  MOV EBX, pbData
  OR EBX, EBX
JZ _Done
MOV ECX, nSize//此处不支持64位
  OR ECX, ECX
  JZ _Done

  _NextByte:
  MOV DL, [EBX]

XOR DL, AL
MOVZX EDX, DL
SHR EAX, 8
  XOR EAX, [dwCRC32Table + EDX*4]

INC EBX
LOOP _NextByte
_Done:
NOT EAX
MOV RetValue, EAX
}
  }

作者: kfrght   发布时间: 2010-12-06

你这个是计算 pbData 指向处的以字节为单位的数据校验的,和 64 位什么有啥关系?

作者: zara   发布时间: 2010-12-06