在asm中使用16的倍数或16的倍数加8时,应为%rsp保持多少大小

时间:2019-05-30 01:26:40

标签: assembly x86-64 calling-convention

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

1 个答案:

答案 0 :(得分:2)

  

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

_start不是一个函数。它没有call,任何堆栈都没有返回地址(仅argc和实际的{ {1}}和argv[]数组)。

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


针对您链接的问题,我再次编辑了杰斯特的答案,以澄清该问题。

必须在envp[]

16字节对齐。回到函数之前,函数内的偏移量为call,包括另一个16 * n + 8 es。