使用汇编的乘法和加法

Multiplication and addition using assembly

所以我尝试使用 ft 函数计算 Salary + (Revenue * Commission),但是我没有得到所需的输出。还要求我使用 axbxcx 寄存器。

ft:  
            
      mov ax, s
      mov bx, r
      add ax, bx
      mov cx, c
      mul cx
      mov cx, ax
      ret
      
main:       
      call ft      
              
             
end:     
       call print_dec
    
    jmp .                # Stop the program from executing further
    
    
s: .word 2310     
r: .word 442      
c: .word 9         

由于表达式Salary + (Revenue * Commission)中的括号,您需要先计算(Revenue * Commission)部分。 即使没有括号,您也必须先计算该部分,因为乘法优先于加法!

这是简短的版本:

mov ax, r
mul c        ; DX:AX = r * c
add ax, s
ret

如果您确实必须使用 AXBXCX

,请使用更长的版本
mov ax, r
mov bx, c
mov cx, s
mul bx       ; DX:AX = r * c
add ax, cx
ret

任务没有提到的是寄存器DX。上面的 mul 指令也会改变那个寄存器!如果不允许这样做,您也许可以使用 imul 指令的 2 操作数变体(但不能在 上使用):

mov ax, r
imul ax, c   ; AX = r * c
add ax, s
ret

如果 imul 指令的特定变体对您来说是不干涉的,那么您可以通过一系列加法进行乘法运算:

  mov cx, c
  xor ax, ax
more:
  add ax, r
  dec cx
  jnz more
  add ax, s
  ret

跟进

对于您在评论中发布的表达式 (Salary * Hrs) + (Revenue * Commission),您必须将第一次乘法的结果存储在备用寄存器中,进行第二次乘法,然后将两个结果相加:

mov ax, r
mul c        ; DX:AX = r * c
mov bx, ax

mov ax, s
mul h        ; DX:AX = s * h

add ax, bx   ; AX = (s * h) + (r * c)
ret