【发布时间】:2015-09-11 17:30:28
【问题描述】:
我有以下 C 代码:
#include <stdio.h>
int function(int a, int b)
{
int res = a + b;
return res;
}
int main(){
function(1,2);
exit(0);
}
我使用 gcc 4.8.2(在 Ubuntu 14 下)为 x86-64 编译它并生成以下代码:
000000000040052d <function>:
40052d: 55 push %rbp
40052e: 48 89 e5 mov %rsp,%rbp
400531: 89 7d ec mov %edi,-0x14(%rbp)
400534: 89 75 e8 mov %esi,-0x18(%rbp)
400537: 8b 45 e8 mov -0x18(%rbp),%eax
40053a: 8b 55 ec mov -0x14(%rbp),%edx
40053d: 01 d0 add %edx,%eax
40053f: 89 45 fc mov %eax,-0x4(%rbp)
400542: 8b 45 fc mov -0x4(%rbp),%eax
400545: 5d pop %rbp
400546: c3 retq
有些东西我听不懂。
一开始我们推送rbp并将rsp保存在rbp中。然后在上面 然后堆栈(并且在 %rbp)我们已经保存了 rbp。那么 rbp 下面的所有内容都是空闲空间。
然后我们将来自 edi 和 esi 的传递参数放置在 -0x14(%rbp) 及以下位置。
但是为什么我们不能把它们直接放在 rbp/rsp 指向的下方呢? edi 和 esi 有 4 个字节长,那为什么不是 -0x8(%rbp) 和 -0xc(%rbp) 呢?它与内存对齐有关吗?
为什么会有一个奇怪的保存 eax 来堆叠并在返回之前读取它?
【问题讨论】: