大会cmp不跳?

时间:2014-02-09 07:58:59

标签: assembly x86

我希望它能打印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

3 个答案:

答案 0 :(得分: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 :(得分: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:

答案 2 :(得分: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的跳跃之后跳过EQUAL的lea