我将3个数字相乘,即使有进位也能正常工作。我想添加第4个数字,仅用于学习目的。
在我乘以3个数字后,我转入EDX并打印。效果很好。 在我添加第4个数字后,我想我乘以32位x 32位?所以它存储到EDX:EAX?
我是否需要将EAX转换为EDX,以便它们一起打印? 我不确定我是否正在为第4号做正确的事情?
.data?
num1 dd ?
num2 dd ?
num3 dd ?
num4 dd ?
.data
sum dd 0
prod dd 0
prod2 dd 0
这是提示
mov EAX, sval(input("Enter first number: "))
mov num1, EAX
mov EAX, sval(input("Enter second number: "))
mov num2, EAX
mov EAX, sval(input("Enter third number: "))
mov num3, EAX
mov EAX, sval(input("Enter fourth number: "))
mov num4, EAX
这是逻辑
mov EAX, num1
mov EBX, num2
mul BL ; 8 bit x 8 bit ----> AX / 16bit
mov EBX, num3
mul BX ; 16bit x 16bit --->DX:AX
shl EDX, 16 ; shift low to high ;high / low in EDX
mov DX, AX ; mov in all reg
mov ECX, num4 ; 32bit x 32bit ---> EDX:EAX
mul CX
mov prod2, EAX ; for printing
我不确定我是否应该将num4移入ECX并乘以CX 我应该乘以32位吗?我对第四个号码做错了什么? 谢谢
答案 0 :(得分:0)
32位乘法使用EAX
寄存器。由于MUL
操作数使用16位寄存器,因此第三次乘法的代码为16位,因此乘法为AX x CX
。 32位乘法需要32位操作数,因此在您的代码中,您需要使用ECX
而不是CX
。此外,32位乘法的准备工作是不完整的,因为该值仍位于EDX
寄存器中。
所以代码应该是这样的:
mov EAX, num1
mov EBX, num2
mul BL ; 8 bit x 8 bit ---> AX / 16bit
mov EBX, num3
mul BX ; 16bit x 16bit ---> DX:AX
shl EDX, 16 ; shift low to high ;high / low in EDX
mov DX, AX ; mov in all reg
mov EAX, EDX ; prepare EAX for 32bit x32bit
mov ECX, num4
mul ECX ; 32bit x 32bit ---> EAX x ECX ---> EDX:EAX
mov prod2, EAX ; for printing
请注意,32位乘法可能会导致EDX:EAX
中的64位值,因此请确保打印函数考虑EDX
寄存器。