我试图弄清楚为什么jz equ
命令在我的代码中不起作用。
显然,它前面的命令(xor bl, bh
)将零标志设置为1
而且当我调试程序时,它也不会跳入equ。
我在这里想念什么?
我似乎无法以任何方式使零跳变起作用... 尝试其他零跳的代码测试也失败了 我缺少有关“跳转零”命令的某些信息,但这是什么?
.model small
.stack 10h
.data
.code
start:
mov ax, @data
mov ds, ax
mov ch, 0
mov cl, 0
mov bh, 21h
mov bl, 21h
xor bl, bh
jz equ
not ch
and ch, cl
jmp end
equ:
add bh, bl
end:
mov ah, 4ch
int 21h
End start
答案 0 :(得分:3)
jz equ
上面的equ
是一个指令,告诉汇编程序用完全没有文本代替文本“ jz”的所有实例。这就是为什么不执行条件跳转的原因。甚至不在那里!
这些是程序执行的指令:
mov ax, @data
mov ds, ax
mov ch, 0
mov cl, 0
mov bh, 21h
mov bl, 21h
xor bl, bh \
|No jump was encoded here
not ch /
and ch, cl
jmp end
end:
mov ah, 4ch
int 21h
只需为此标签选择一个更好的名称:
xor bl, bh
jz IsZero
not ch
and ch, cl
jmp end
IsZero:
我希望您不会仅仅通过在程序结束时查看registerdump来得出jz equ
不能工作的结论,因为无论如何,所有寄存器都将具有相同的最终值。 BX=2100h CX=0000h
两个分支最后都不会更改寄存器值:
失败
not ch 0 becomes 255
and ch, cl 255 returns back to 0
如果为零则跳转
add bh, bl 21h is raised by 0
.stack 10h
更好地设置更大的堆栈。 16个字节有点不现实。我建议最少为256个字节。