大会cmp不跳? [重复]

问题描述 投票:-1回答:3

这个问题在这里已有答案:

我希望它打印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
assembly x86
3个回答
1
投票

如果你写

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
           [...]

1
投票

即使你跳到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:

0
投票
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的分支

© www.soinside.com 2019 - 2024. All rights reserved.