大会'召唤'vs'jmp'

use*_*489 17 x86 assembly subroutine

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

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

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

谢谢你提前获得任何帮助.

_start:

    jmp _Print
    jmp _Exit

ret


_Exit:

    ; normal exit 

ret


_Print

    ; print something

ret
Run Code Online (Sandbox Code Playgroud)

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

小智 28

好吧,首先,jmp只需"跳转"到你给它的标签(这是一个存储器地址,因为程序指令存储在内存中),同时call存储它将call在堆栈中返回的位置(在指令下面),jmp到标签,然后在ret指令处,jmp返回到存储的位置(如上所述,在调用指令下面).你可以看到有点不同.恕我直言,我相信简单的call函数很好,因为这是c ++编译器对函数的作用,但如果你必须jmp,那么好吧,只需确保push返回位置或创建另一个标签,一旦完成执行一些代码就返回.

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

_start:



 jmp _Print;



_start_label:



 jmp _Exit;

_Exit:
 ; exit stuff goes here

 ret;     

_Print:

;print stuff goes here

jmp _start_label;
Run Code Online (Sandbox Code Playgroud)

或者你可以使用电话:)