Assembly 你不跳吗?
我想让它打印两个数字是否相等,尽管我认为跳转功能不正确Assembly 你不跳吗?,assembly,x86,Assembly,X86,我想让它打印两个数字是否相等,尽管我认为跳转功能不正确 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, NE
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
[...]
即使你跳到某个地方,你仍然会直接执行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:
遵循你的代码。如果它跳到哪里,那么它将跳过某处的jne和lea NEQUAL。如果它没有跳转,那么无论它执行什么,lea NEQUAL和lea相等。您定义的所有代码路径将生成lea dx,等于,然后继续。若要完成此操作,则需要在NEQUAL的lea之后有一个分支,该分支跳过EQUAL的lea
cmp cl, dl
JE where
JNE somewhere
somewhere: lea dx, NEQUAL
where: lea dx, EQUAL