我正在阅读一本教科书,其中显示了基于 C 代码的汇编代码:
代码:
void echo()
{
char buf[8];
otherFunction(buf);
}
Run Code Online (Sandbox Code Playgroud)
汇编代码:
echo:
subq $24, %rsp //Allocate 24 bytes on stack, but why allocate 24 instead of 8 bytes?
movq %rsp, %rdi //Compute buf as %rsp
call otherFunction
Run Code Online (Sandbox Code Playgroud)
我不明白为什么堆栈指针%rsp
会减少 24 个字节。我只将 8 个字节的缓冲区分配为char buf[8];
,并且没有被调用者保存的寄存器压入堆栈,指令不应该是
subq $8, %rsp
Run Code Online (Sandbox Code Playgroud) 我读过的,因为它是为"业绩原因"做不同的地方,但我仍然不知道什么是在性能得到这个16字节对齐提高了特殊情况.或者,无论如何,选择这个的原因是什么.
编辑:我想我以误导的方式写了这个问题.我没有询问为什么处理器使用16字节对齐的内存更快地处理事情,这在文档中随处可见.我想要知道的是,强制执行16字节对齐比仅让程序员在需要时自己对齐堆栈更好.我问这个是因为根据我的汇编经验,堆栈实施有两个问题:只有少于1%的执行代码才有用(所以其他99%实际上是开销); 它也是一个非常常见的错误来源.所以我想知道它最终是如何得到回报的.虽然我对此仍有疑问,但我接受了彼得的回答,因为它包含了我原来问题的最详细答案.
这个问题是关于 32 位与 64 位 x86 的术语。
如果我有 2 个包含相同程序源代码的目录 - 一个用于 32 位 Windows,另一个用于 64 位 Windows,那么这些文件夹的更正确名称是什么:
我已经阅读了一些网络资源,但无法理解。仅作记录: