所以当我尝试用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时。
这怎么可能发生?我迷路了。
答案 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。