我正在尝试解决这个表达式
F = 56 - X / (Y * 17)
在汇编中(Emu8086)
X、Y 是变量。
我是一个完全的初学者,我已经这样做了(但可能不正确):
Mov bx, 56 ; BХ = 56
Mov ax, Y ; AX = Y
Mov cx, 17 ; CX = 17
Mul cx ; DX:AX = AX * CX (Y * 17)
Xor dx, dx ; set DX to zero -> AX = (Y * 17)
Mov cx, ax ; CX = (Y * 17)
Mov ax, X ; AX = X
Div cx ; AX / CX -> AL = X / (Y * 17)
; AH - remainder
;Add bx, ? (I can't add bx and al) How to solve this issue?
接下来会发生什么?
我正在尝试解决这个表达式
F = 56 - X / (Y * 17)
(Y * 17)
周围的括号是这里最重要的。如果没有它们,您首先必须将 X 除以 Y,然后将 that 乘以 17。
您似乎已经假设X和Y都是字大小无符号变量。
对于字大小的乘法,操作数之一必须位于 AX 寄存器中。只需将常量 (17) 加载到 AX 中,然后通过内存操作数加载
mul
即可。这将在 DX:AX 中留下 32 位乘积,让我们假设该乘积在 16 位范围内[0,65535]:
mov ax, 17
mul Y ; -> DX:AX is product, assuming DX=0 (*)
对于现在必须遵循的字大小除法,DX:AX 寄存器对中的被除数是强制性的,因此我们需要将乘积
Y * 17
移到其他地方:
mov bx, ax
mov ax, X ; Still assuming DX=0, so this shaves off `xor dx, dx`
div bx ; -> AX is quotient, DX is remainder
大多数时候,我们希望在 AX 中传递结果,因此我们可以将之前的商移到别处,然后最后进行减法,如
mov bx, ax
mov ax, 56
sub ax, bx
,但由于 56 - Q
等于 56 + -Q
等于-Q + 56
,我们可以写成:
neg ax
add ax, 56
替代方案不需要假设产品在 16 位范围内:
因为
56 - X / (Y * 17)
等于 56 - X / Y / 17
并且遵循代数规则(优先级和从左到右):
xor dx, dx ; X / Y
mov ax, X
div Y ; -> AX is quotient, DX is remainder
xor dx, dx ; (X / Y) / 17
mov bx, 17
div bx ; -> AX is quotient, DX is remainder
neg ax ; 56 - ((X / Y) / 17)
add ax, 56