似乎无法理解 JZ,没有按预期工作
Can't seem to understand JZ, not working as expected
我想弄明白为什么 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 字节。
我想弄明白为什么 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 字节。