我被告知尝试使用“jmp”而不是“call”,但是“jmp”不喜欢我..当我跳跃时它不会返回(所以它永远不会退出并且不快乐的日子),但是调用会返回并正常退出。
我很高兴使用“call”,但实际上我应该尝试克服“jmp”吗?
这个简单的代码只是显示当我jmp
时它是否永远不会返回并退出。
_start:
jmp _Print
jmp _Exit
ret
_Exit:
; normal exit
ret
_Print
; print something
ret
另外..如果这会改变什么的话,我正在Linux终端中运行这一切。
最佳答案
首先,jmp
只是在 call
时“跳转”到您为其指定的标签(这是程序指令存储在内存中的内存地址) code> 将返回的位置(在 call
指令下方)存储在堆栈中,jmp
到标签,然后在 ret
处指令,jmp
返回到存储的位置(如上所述,在调用指令下方)。正如您所看到的,有一点不同。恕我直言,我相信简单地调用
函数就可以了,因为这就是c++编译器对函数所做的事情,但如果你必须jmp
,那么好吧,只要确保推送
返回位置或创建另一个标签以在执行完某些代码后返回。
这是完成后跳转到其他标签的示例:
_start:
jmp _Print;
_start_label:
jmp _Exit;
_Exit:
; exit stuff goes here
ret;
_Print:
;print stuff goes here
jmp _start_label;
或者你可以直接使用 call :)
关于程序集 'call' 与 'jmp',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793117/