我有下面的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堆棧和返回之前回讀?