汇编语言 - masm32 - 乘法

时间:2012-07-16 22:16:30

标签: assembly masm masm32

我将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位吗?我对第四个号码做错了什么? 谢谢

1 个答案:

答案 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寄存器。