如何用Emu8086汇编实现表达式F=56-X/(Y*17)?
解决Emu8086中16位与8位寄存器运算的问题
你的问题核心是8086汇编要求算术运算的操作数位数必须一致——BX是16位寄存器,AL是8位寄存器,直接相减会触发错误。结合你的表达式F = 56 - X/(Y*17),可以用两种简单方法解决:
方法1:将8位商扩展为16位后运算
因为div cx执行后,AH中是除法余数,我们需要先清除AH,把AL的8位商扩展为16位的AX,再用BX减去AX(此时BX中是56,高8位BH为0,本身就是16位的有效数值):
Mov bx, 56 ; BX = 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 = 余数 ; 新增处理步骤 Xor ah, ah ; 清除余数,将AL的8位商扩展为16位AX(AX = 商) Sub bx, ax ; BX = 56 - 商,即最终结果F
方法2:直接操作BX的低8位寄存器BL
由于你给BX赋值的是56(小于256),BX的高8位BH实际是0,因此可以直接用BL(BX的低8位)和AL做减法,结果仍存在BL中,BX整体就是最终结果:
Mov bx, 56 ; BX = 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 = 余数 ; 新增处理步骤 Sub bl, al ; BL = 56的低8位 - 商,BX = 00H + BL,即最终结果F
额外注意事项
- 如果
X/(Y*17)的商超过8位(即大于255),方法2会出错,此时必须用方法1的16位运算。 - 确保X、Y是无符号数,因为你用的是
mul和div(无符号乘除指令),如果是有符号数需要改用imul和idiv,并且扩展符号位要用cbw或cwd指令。
内容的提问来源于stack exchange,提问作者Khu
相关产品推荐
相关产品推荐

