比较值然后存储IP并跳转Assembly x86

时间:2018-03-02 14:12:50

标签: assembly x86

我正在尝试创建一个将变量与0进行比较的汇编程序,如果它低于0则跳转:

mov eax, [ebx]
cmp eax, 0
jl input1

但是,我跳转到一个 ret 的标签,因此它需要在子例程完成时返回的位置。如何在跳转之前找到指令指针的当前位置并将其推入堆栈?

这是input1子程序:

            input1:
            push inputnumber
            lea eax, inputmsg
            push eax
            call printf
            add esp, 8

            push ebx
            lea eax, format
            push eax
            call scanf
            add esp, 8  
            ret

1 个答案:

答案 0 :(得分:3)

使用call。由于没有条件版本,请使用反向条件跳转跳过它。 E.g。

mov eax, [ebx]
cmp eax, 0
jge skip ; reversed jl
call input1
skip:
...

如果它应该是一个范围检查循环,例如:

do {
    inputnumber = input1();
} while (inputnumber < 0 || inputnumber > 100);

然后你可以这样做:

repeat:
    call input1
    mov eax, [inputnumber]
    cmp eax, 0
    jl repeat
    cmp eax, 100
    jg repeat