汇编 Emu8086 中的 F = 56 - X / (Y * 17)

问题描述 投票:0回答:1

我正在尝试解决这个表达式

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?
 

接下来会发生什么?

assembly expression x86-16 emu8086
1个回答
0
投票

我正在尝试解决这个表达式

F = 56 - X / (Y * 17)

(Y * 17)
周围的括号是这里最重要的。如果没有它们,您首先必须将 X 除以 Y,然后将 that 乘以 17。

您似乎已经假设XY都是字大小无符号变量。
对于字大小的乘法,操作数之一必须位于 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
© www.soinside.com 2019 - 2024. All rights reserved.