2015-01-11 78 views
0

因此当我试图用32位来测试一个32位时我有一些奇怪的结果。mul'ing的结果不准确

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

这怎么可能发生呢?我搞不清楚了。

+0

你认为什么是错的? –

+0

结果...?由于writedec调用和ebx,你可以看到自己的错误 – user3885166

+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。

+0

是的,这对32位来说太大了,但是mul存储结果是64位--32位edx和32位eax,它的工作?如果不是那样,我还可以实现乘以更大的数字吗? – user3885166

+1

它确实有效! EDX是1 - 正确的。 EAX是1932053504 - 也正确。 –

+0

哎呀!在100000000上滑过零。编辑它。 –