我想了解C編譯器在編譯爲彙編時將執行什麼操作。我編譯到彙編代碼是這樣的:編譯器在這個彙編代碼中做了什麼?
void main() {
int x = 10;
int y = 10;
int a = x + y;
}
將會產生以下組件:
.Ltext0:
.globl main
main:
.LFB0:
0000 55 pushq %rbp
0001 4889E5 movq %rsp, %rbp
0004 C745F40A movl $10, -12(%rbp)
000b C745F80A movl $10, -8(%rbp)
0012 8B45F8 movl -8(%rbp), %eax
0015 8B55F4 movl -12(%rbp), %edx
0018 01D0 addl %edx, %eax
001a 8945FC movl %eax, -4(%rbp)
001d 5D popq %rbp
001e C3 ret
但是我有一些很難理解尤其是在這個片段是怎麼回事。我瞭解所有的標籤和一些裝配。這是我認爲它的作用:
- push rbp? - 這是一個堆棧框架還是什麼?
- 設置堆棧指針指向基址指針? (即清除堆棧)
- 將10移入堆棧?偏移量爲-12?爲什麼12,爲什麼是負面的?
- 在-8代替-12在-8(4差異,也許字節或什麼?)
- 移動值在-12移動10插入棧,雖然此時進入EAX
- 移動值到EDX
- add eax and edc
- 將值從eax移入堆棧
- pop rbp?函數堆棧幀結束可能嗎?
- 從函數返回??
任何人都可以澄清這個組件的某些點,也許是編譯器具有推理在選擇-8,-12,爲什麼選擇EAX和EDC在其他一些寄存器,它爲什麼push和pop RBP等?
對於你的每一個問題的答案是「閱讀關於堆棧幀的好介紹文本」 –
@ WumpusQ.Wumbley哈哈,好吧我會這麼做的! – mosmo