大会 'call' 与 'jmp'

Assembly 'call' vs 'jmp'

有人告诉我尝试使用'jmp 而不是 'call',但是 'jmp' 不喜欢我.. 当我跳的时候它不 return(所以它永远不会退出而不是快乐的日子),但调用 returns 并正常退出。

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

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

_start:

    jmp _Print
    jmp _Exit

ret


_Exit:

    ; normal exit 

ret


_Print

    ; print something

ret

还有 .. 我 运行 这一切都在 Linux 终端,如果有任何改变的话。

嗯,首先,jmp 简单地 'jumps' 你给它的标签(这是一个内存地址,因为程序指令存储在内存中)而 call将return(在call指令下方)的位置存储在堆栈中,jmp到标签,然后在ret指令处,jmp回到存储的位置(如上所述,在调用指令下方)。如您所见,那里有点不同。恕我直言,我认为简单地 call 函数很好,因为这是 c++ 编译器对函数所做的,但是如果你必须 jmp,那么好吧,只要确保 push return 位置或创建另一个标签到 return 以完成执行某些代码。

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

_start:



 jmp _Print;



_start_label:



 jmp _Exit;

_Exit:
 ; exit stuff goes here

 ret;     

_Print:

;print stuff goes here

jmp _start_label;

或者您可以直接调用 :)