我有下面的C代码:x86_64的ABI:拆卸问题
#include <stdio.h>
int function(int a, int b)
{
int res = a + b;
return res;
}
int main(){
function(1,2);
exit(0);
}
我编译它为x86-64的与GCC 4.8.2(Ubuntu的14下),它产生的代码:
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 and esi是4个字节长,为什么不是-0x8(%rbp)和-0xc(%rbp)呢?它是否与内存对齐连接?
为什么有一个奇怪的储蓄EAX堆栈和返回之前回读?