2015-01-11 76 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上滑過零。編輯它。 –