大会'召唤'vs'jmp'

时间:2015-09-26 02:47:36

标签: assembly x86 subroutine

我被告知要尝试使用'jmp而不是'call',但是'jmp'并不喜欢我..当我跳的时候它不会返回(因此它永远不会退出并且不是快乐的日子),但是调用返回并正常退出。

我很高兴使用'call',但实际上我有理由尝试克服'jmp'吗?

这个简单的代码只显示当我jmp时它永远不会返回并退出。

_start:

    jmp _Print
    jmp _Exit

ret


_Exit:

    ; normal exit 

ret


_Print

    ; print something

ret

同样..如果改变了什么,我在Linux终端中运行这一切。

1 个答案:

答案 0 :(得分:23)

嗯,首先,jmp只是“跳跃”'到你给它的标签(程序指令存储在内存中的内存地址),而call存储它将返回的位置(在call指令下面),{ {1}}到标签,然后在jmp指令,ret回到存储的位置(如上所述,在调用指令下面)。你可以看到有点不同。恕我直言,我认为简单地jmp函数是好的,因为这是c ++编译器对函数的作用,但如果你必须call,那么好吧,只需确保jmp返回位置或创建另一个标签,以便在完成执行某些代码后返回。

以下是完成后跳转到其他标签的示例:

push

或者您可以使用call:)