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。
所以我在尝试将 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。