我想了解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