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