【问题标题】:What size should I maintain for %rsp when alloc stack in asm, multiple of 16 or multiple of 16 plus 8在 asm 中分配堆栈时,我应该为 %rsp 保持什么大小,16 的倍数或 16 的倍数加 8
【发布时间】:2019-10-15 15:40:50
【问题描述】:

在这个答案Segmentation fault on printf - NASM 64bit Linux 中,第一作者说当我分配堆栈时,%rsp 必须保持 16 的倍数加 8,因为之后函数调用会将地址推送到堆栈上,但是在 ABI 中,它说 rsp 必须是 16 的倍数在程序入口中,当我真正尝试时,我发现保持 16 的 rsp 倍数加 8 会导致分段错误,即使之后我调用 printf@PLT,但保持 16 的倍数有效,那么当分配堆栈时我应该为 rsp 做什么?

【问题讨论】:

    标签: assembly x86-64 calling-convention


    【解决方案1】:

    但是在 ABI 中,它说 rsp 在程序入口中必须是 16 的倍数

    _start 不是一个函数。 它不是call 被任何东西,堆栈上没有返回地址(只有argc 和实际的argv[] 和envp[]数组)。

    是的,在 process 条目上,RSP 已经是 16 字节对齐的,可以进行函数调用了。


    我再次编辑了 Jester 对您链接的问题的回答以澄清它。

    16 字节对齐之前 call 是要求。在另一个调用(包括任何pushes)之前,您可以在函数内部使用16 * n + 8 的偏移量返回到该位置。

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多