程序集 'call' 与 'jmp'

标签 assembly x86 subroutine

我被告知尝试使用“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/

相关文章:

c - 为什么在 nasm 中使用外部 c 函数会破坏此代码?

c++ - C++ 编译器如何知道正在使用哪种 CPU 架构

x86 - 在英特尔酷睿 i3/i7 的情况下,从缓存集驱逐后数据的去向

Fortran 子例程值关键字

debugging - 在 x32dbg/x64dbg 中,我如何自动跟踪 'dump window' 中的堆栈(ESP)?

delphi - 调用汇编语言函数导致 "floating point stack check"异常

linux - 将内存与自定义 ELF 文件一起使用时出现段错误

linux - 汇编代码不识别?和@data

c - 我无法从子例程打印最终数组

excel - 子函数和函数之间的区别: what does "return a value" mean?