在调用 printf 之前推送到堆栈时出现段错误

问题描述

如果我在调用 printf 之前将某些东西压入堆栈,下面的程序会出现段错误。我不明白为什么会发生这种情况,因为我的假设是 system v abi / x86_64 参数是通过寄存器传递的(至少是前 6 个),那么为什么 printf 会查看堆栈(更是如此,超出它的基指针)?还是我误会了什么?

这是段错误的程序:

.data
.LC0:
        .string ""
.text
.global main
main:
        PUSHQ  %rbp
        MOVQ   %rsp,%rbp
        PUSHQ  $1
        MOVQ   $.LC0,%rdi
        MOVQ   $0,%rax
        CALL   printf         
        RET

我编译并运行它: gcc -no-pie hello.s -o hello && ./hello

当我在 POPQ %rbx 之后添加 PUSHQ 时,它不会出现段错误。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)