【问题标题】:Can't seem to understand JZ, not working as expected似乎无法理解 JZ,无法按预期工作
【发布时间】:2023-03-05 21:58:02
【问题描述】:

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

【问题讨论】:

  • 代码肯定会跳转到equ(注意equ 是一个不好的名称选择,因为它也是一个汇编指令)。我会说你的调试器有问题,或者你使用调试器的方式有问题。
  • add bh, bl 在您将bl 归零后,xor 在两个相等的值之间毫无意义。除非您在 XOR 之后使用调试器修改寄存器值。

标签: assembly x86-16 tasm


【解决方案1】:
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 字节。

【讨论】:

  • 正要写,感谢@Michael,我找到了答案,非常感谢!
  • 不错的收获!但是调试器应该首先表明 jz 指令不存在。
猜你喜欢
  • 2019-11-27
  • 2020-05-31
  • 1970-01-01
  • 2019-06-26
  • 2019-09-25
  • 2016-07-27
  • 2012-04-20
  • 2015-03-22
  • 2015-05-19
相关资源
最近更新 更多