我正在通过Nick Desaulniers工作:Let's Write Some X86-64文件h4.s:
.text
.globl main
main:
# subq $8, %rsp
movq $0, %rdi
call _exit
他在Mac上运行并说运行上述操作会产生分段错误。我正在使用opensuse 13.1运行
gcc h4.s
编译和链接。调整堆栈指针或注释掉行时,我没有遇到段错误。有谁知道为什么不呢? SP是否需要与16字节边界对齐?
答案 0 :(得分:2)
64位ABI要求堆栈指针在进入例程(16B与堆栈上推送的返回地址对齐)时为8个mod 16字节。硬件不需要这样,因此,如果在堆栈未正确对齐时进行调用,则不会“死”。
但是,如果堆栈未对齐,并且有人在某些时候想要做一些基于他们具有16B对齐堆栈的假设(例如,发出对齐的xmm指令,如“movdqa [esp],.. 。“,那么你可以得到实际的失败(非法指令,段错误等,取决于正在做什么)。
总结:在调用之前简单地错位堆栈不会导致立即错误,除非有人后来需要堆栈对齐。