使用汇编的乘法和加法
Multiplication and addition using assembly
所以我尝试使用 ft 函数计算 Salary + (Revenue * Commission)
,但是我没有得到所需的输出。还要求我使用 ax
、bx
和 cx
寄存器。
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
如果您确实必须使用 AX
、BX
和 CX
:
,请使用更长的版本
mov ax, r
mov bx, c
mov cx, s
mul bx ; DX:AX = r * c
add ax, cx
ret
任务没有提到的是寄存器DX
。上面的 mul
指令也会改变那个寄存器!如果不允许这样做,您也许可以使用 imul
指令的 2 操作数变体(但不能在 8086 上使用):
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
所以我尝试使用 ft 函数计算 Salary + (Revenue * Commission)
,但是我没有得到所需的输出。还要求我使用 ax
、bx
和 cx
寄存器。
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
如果您确实必须使用 AX
、BX
和 CX
:
mov ax, r
mov bx, c
mov cx, s
mul bx ; DX:AX = r * c
add ax, cx
ret
任务没有提到的是寄存器DX
。上面的 mul
指令也会改变那个寄存器!如果不允许这样做,您也许可以使用 imul
指令的 2 操作数变体(但不能在 8086 上使用):
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