在函数内部推送时出现分段错误 x86_64 GAS

Segmentation fault on push inside a function x86_64 GAS

我有一个小程序,它只是将一个项目添加到堆栈,然后输入一个函数来添加另一个项目。问题是每次执行它都会有奇怪的行为。

函数如下:

.section .data

.section .text

.globl _start
_start:
    # Push
    push 
    # Function call
    call pfun
    movq , %rax
    syscall

.type pfun, @function
pfun:
    # Push
    push 
    # Return
    ret

一点都不复杂,但会失败并给出分段错误,如果您尝试调试它,您会发现错误发生在程序进入函数内部时,但它不会有任何关于它所在位置的信息。

Program received signal SIGSEGV, Segmentation fault. 0x0000000000000002 in ?? ()

现在,如果您在函数 push 和 运行 之后添加一个 "pop",那么它将成功构建并 运行。但是如果你调试它,你会发现它永远不会使用 "n"(next) 命令进入函数内部。

我搜索了一个答案,但没有找到任何与 ASM 相似的答案。最近开始学习 ASM,对我来说它看起来非常好,所以真的不知道为什么会这样。

您的问题在这里:

pfun:
    push 
    ret

我认为您没有正确理解 call/ret。您的功能等同于 jmp 2 并且总是在下午触发异常。 call 等同于 push (r)eip and then jmpretpop (r)eip。在 call/function 中,您需要 pop 您在此处推送的所有内容或 add (r)esp,0x??