【发布时间】:2014-01-19 05:39:04
【问题描述】:
我在汇编中使用 MUL (MASM) 将两个整数相乘。
根据 MASM 指令集文档,产品存储在 EDX:EAX 中,即 EDX 和 EAX 寄存器的组合(如果我理解正确的话)。
所以我尝试先打印出 EDX 寄存器的结果,然后再打印 EAX 寄存器以打印出整数。
但是当我得到一个据称超过 32 位(小数点后 10 位)的产品时,我得到了一个奇怪的答案。
例如 100000 * 100000 = 21410065408 ,这是错误的。
但是对于小的乘法,它可以工作。
这是汇编代码:
; MULTIPLY
mov eax, var1 ; var1 and var2 from user input
mul var2
mov productResultEDX, edx
mov productResultEAX, eax
; PRINT RESULT
; mov edx, OFFSET productMsg
call WriteString
mov eax, productResultEDX
call WriteDec ; prints out EAX register data
;mov eax, productResultEAX
;call WriteDec
所有变量都声明为 32 位 DWORDS
我是不是搞错了?
【问题讨论】:
-
请注意,100000 * 100000 的低 32 位是十进制值 1410065408。高 32 位是十进制值 2。这解释了你的结果,虽然我不确定你会如何修复您的代码以显示正确的结果。
-
嗯,解释我的结果是什么意思?
-
你打印出前 32 位的十进制值,2。然后你打印出低 32 位的十进制值,1410065408。将它们粉碎在一起。 21410065408,你的结果。您不能一个接一个地打印它们;你会得到毫无意义的结果。