似乎无法理解JZ,无法正常工作

时间:2019-01-12 17:31:11

标签: assembly x86-16 tasm

我试图弄清楚为什么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

1 个答案:

答案 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个字节。