mul'ing 时结果不准确

Inaccurate result when mul'ing

所以我在尝试将 32 位乘以 32 位时得到了一些奇怪的结果。

 mov eax, [bignum]  
 call writedec
 call crlf

 mul ebx                ;EDX:EAX = EAX*EBX
 mov [bignum], eax  ;save result
 call writedec
 call crlf

 mov eax, edx
 call writedec
 call crlf
 mov ecx, edx           ;save carried part in ECX

这打印出来:

479001600

1932053504

1

当ebx为13时

这怎么可能发生?我迷路了。

479001600*13=6227020800,或者,十六进制的 0x17328CC00。这对于 32 位来说太大了。

1*0x100000000=0x100000000

0x17328CC00-0x100000000=0x7328CC00,或十进制的 1932053504。

所以,这里没有新闻。

换句话说,您的结果在 EDX 中为 1,在 EAX 中为 1932053504。

EDX 包含结果的高 32 位,因此乘以 2^32,即。 0x100000000:

1 * 0x100000000 = 0x100000000

EDX 包含结果的低 32 位:

0x7328CC00

将它们相加得到全部 64 位结果:

0x100000000 + 0x7328CC00 = 0x17328CC00

0x17328CC00 十进制为 6227020800 QED。