相关疑难解决方法(0)

为什么 GCC 在堆栈上分配的空间超出了必要的空间,超出了对齐所需的空间?

我正在阅读一本教科书,其中显示了基于 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)

c assembly gcc callstack x86-64

9
推荐指数
2
解决办法
362
查看次数

为什么System V/AMD64 ABI要求16字节堆栈对齐?

我读过的,因为它是为"业绩原因"做不同的地方,但我仍然不知道什么是在性能得到这个16字节对齐提高了特殊情况.或者,无论如何,选择这个的原因是什么.

编辑:我想我以误导的方式写了这个问题.我没有询问为什么处理器使用16字节对齐的内存更快地处理事情,这在文档中随处可见.我想要知道的是,强制执行16字节对齐比仅让程序员在需要时自己对齐堆栈更好.我问这个是因为根据我的汇编经验,堆栈实施有两个问题:只有少于1%的执行代码才有用(所以其他99%实际上是开销); 它也是一个非常常见的错误来源.所以我想知道它最终是如何得到回报的.虽然我对此仍有疑问,但我接受了彼得的回答,因为它包含了我原来问题的最详细答案.

assembly x86-64 abi

5
推荐指数
1
解决办法
1144
查看次数

引用 32 位和 64 位版本程序的最正确方法

这个问题是关于 32 位与 64 位 x86 的术语。

如果我有 2 个包含相同程序源代码的目录 - 一个用于 32 位 Windows,另一个用于 64 位 Windows,那么这些文件夹的更正确名称是什么:

  • x86-64x64 ?
  • 还是IA-32x64

我已经阅读了一些网络资源,但无法理解。仅作记录:

64-bit x86 terminology x86-64

2
推荐指数
2
解决办法
1355
查看次数

标签 统计

x86-64 ×3

assembly ×2

64-bit ×1

abi ×1

c ×1

callstack ×1

gcc ×1

terminology ×1

x86 ×1