这个问题在这里已有答案:
我希望它打印2个数字是否相等虽然我认为跳转功能不正常。
TITLE pilot
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
.CODE
BEGIN:
mov ax, @data
mov ds, ax
mov es, ax
mov cl, 05h
mov dl, 10h
cmp cl, dl
JE where
JNE somewhere
somewhere:
lea dx, NEQUAL
where:
lea dx, EQUAL
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
end BEGIN
它只是打印出之前的那个
mov ah, 09h
int 21h
如果你写
somewhere: lea dx, NEQUAL
where: lea dx, EQUAL
然后第二次对dx
的影响将始终覆盖第一个。此外JNE没有必要,因为JE
没有跳。所以你应该写:
cmp cl, dl
JE where
lea dx, NEQUAL
jmp sequel:
where: lea dx, EQUAL
sequel: mov ah, 09h
int 21h
[...]
这就像你忘了把别人放进去了
if (cl == dl) dx = NEQUAL
dx = EQUAL
[...]
即使你跳到somewhere
,你仍然会直接执行where
部分,因为没有跳过跳过它。我建议将支票更改为:
cmp cl, dl
jne not_equal
lea dx, EQUAL
jmp check_done
not_equal:
lea dx, NEQUAL
check_done:
或者,甚至更简单:
cmp cl, dl
lea dx, EQUAL
je check_done
lea dx, NEQUAL
check_done:
cmp cl, dl
JE where
JNE somewhere
somewhere: lea dx, NEQUAL
where: lea dx, EQUAL
按照你的代码。如果它跳到那里它会跳过某处的jne和lea NEQUAL。如果它没有进行跳跃,那么无论它执行lea NEQUAL和lea EQUAL是什么。您定义的所有代码路径都会生成lea dx,EQUAL,然后继续。完成这个if-then-else你需要在NEQUAL的lea之后跳过EQUAL的lea的分支