【发布时间】:2013-01-07 16:31:00
【问题描述】:
谁能向我解释为什么下面的代码行 int main (int argc, char *argv[])
{
int i=17;
int output=0
.....
}
翻译成以下 x64 汇编代码:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movl %edi, -20(%rbp)
movq %rsi,-32(%rbp)
movl $17, -8(%rbp)
movl $0, -4(%rbp)
...
我不明白为什么 SP 减少了 32。寄存器 %edi、%rsi 似乎对应于主代码中未使用的 argc 和 *argv[]。我认为 [%esp, %rbp] 之间的空间仅分配给局部变量而不是函数 args,因此在上面的代码中大小应该只有 8,即 rsp 应该减少 8 而不是 32。请解释一下?
【问题讨论】:
-
参考forum.valhallalegends.com/index.php?topic=16602.0 msdn.microsoft.com/en-us/magazine/cc301698.aspx 看来都是编译器优化的部分。但是,由于它仍然需要遵守调用约定(在本例中为
cdecl),因此它们在被调用后仍然存储在堆栈中。 -
对我来说,看起来 GCC 像这样布置堆栈:[输出:4 字节] - [i:4 字节] - [对齐填充:12 字节] - [home EDI 的空间: 4 字节] - [到家 RSI 的空间:8 字节]。我猜这 12 个填充字节是为了将堆栈重新对齐到 16 字节边界。
标签: function gcc assembly stack 64-bit