mul'ing时的结果不准确

时间:2015-01-11 02:57:24

标签: assembly x86 factorial multiplying

所以当我尝试用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时。

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

1 个答案:

答案 0 :(得分:3)

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。