assembly - 似乎无法理解 JZ,没有按预期工作

标签 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

最佳答案

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:

我希望您不会仅通过在程序结束时查看寄存器转储来得出 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 字节。

关于assembly - 似乎无法理解 JZ,没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162136/

相关文章:

assembly - 如何将 asm 着色器编译为 fxo 文件?

assembly - 8086 - 将命令行参数存储在数组中

assembly - 从 TASM 中的 FPU 堆栈弹出 TWORD 变量

组装作业

使用预取优化

java - Java 中的代码注入(inject)/程序集内联?

assembly - 我应该为 Intel 8086 DOS 程序集使用什么代码框架?

assembly - 检查 emu 8086 中不带 INT 21h 的回文字符串

string - 查找输入字符串中的子字符串

performance - 保存左移(SHL)中偏移的位