У меня есть следующий код на C:
#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 и esi равны 4 байтами, почему бы тогда не -0x8 (% rbp) и -0xc (% rbp)? Это связано с выравниванием памяти?
А почему странно сохранять eax в стек и читать его перед возвратом?