Assembly Can';我似乎不理解JZ,没有按预期工作

Assembly Can';我似乎不理解JZ,没有按预期工作,assembly,x86-16,tasm,Assembly,X86 16,Tasm,我试图弄清楚为什么jz eq命令在我的代码中不起作用。 显然,它前面的命令(xor bl,bh)将零标志设置为1 但当我调试程序时,它并没有跳入equ 我错过了什么 我似乎无法使零跳以任何方式起作用。。。 尝试了其他跳转为零的代码测试,但也失败了 我遗漏了一些关于跳转零的命令,但它是什么 .model small .stack 10h .data .code start: mov ax, @data mov ds, ax mov ch, 0 mo

我试图弄清楚为什么
jz eq
命令在我的代码中不起作用。 显然,它前面的命令(
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
上面的
eq
是一个指令,它告诉汇编程序将文本“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 eq
不工作,因为所有寄存器都将具有相同的最终值<代码>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
    


最好设置一个更大的堆栈。16字节有点不切实际。我建议至少256字节。

代码当然会跳到
eq
(注意
eq
是一个糟糕的名称选择,因为它也是一个汇编指令)。我想说你的调试器有问题,或者你使用调试器的方式有问题。
add bh,bl
在两个相等的值之间用一个
xor
将bl归零后,是没有意义的。除非你在XOR刚要写的时候用调试器修改了寄存器的值,我发现答案要感谢@Michael,非常感谢!接得好!但是调试器应该首先显示jz指令不在那里。
add bh, bl     21h is raised by 0
.stack 10h