0

我将 3 个数字相乘,即使有进位也能很好地工作。我想添加第四个数字来乘以仅用于学习目的。

在我乘以 3 个数字后,我转移到 EDX 并打印。效果很好。在我添加第四个数字后,我想我乘以 32 位 x 32 位?所以它存储到 EDX:EAX 中?

然后我需要将 EAX 转换为 EDX 以便它们一起打印吗?我不确定我是否为第四个号码做对了?

.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 位吗?我对第四个数字做错了什么?谢谢

4

1 回答 1

0

32 位乘法使用EAX寄存器。您的第三次乘法代码是 16 位的,因为您的MUL操作数使用 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 位乘法可能会导致 64 位值EDX:EAX,因此请确保您的打印功能EDX考虑了寄存器。

于 2012-07-18T00:30:49.323 回答