文章目录
- [1 预处理](#1 预处理)
- [2 编译阶段](#2 编译阶段)
- [3 汇编阶段](#3 汇编阶段)
- [4 链接阶段](#4 链接阶段)
c
#define N 10
// 这是一个加法函数
int add(int a, int b){
return a+b;
}
int main(){
int a = 10;
int b = 20;
int c = add(a, b);
int d = N;
return 0;
}
1 预处理
shell
g++ -E main.cpp -o main.i
作用:
1 去掉注释
2 与处理指令替换
3 头文件替换
生成 a.i
c
int add(int a, int b){
return a+b;
}
int main(){
int a = 10;
int b = 20;
int c = add(a, b);
int d = 10;
return 0;
}
2 编译阶段
shell
g++ -S main.i -o main.s
作用:
1 翻译成汇编语言
2 检查代码报错
生成 a.s
c
.file "a.c"
.text
.globl add
.def add; .scl 2; .type 32; .endef
.seh_proc add
add:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
.seh_endprologue
movl %ecx, 16(%rbp)
movl %edx, 24(%rbp)
movl 16(%rbp), %edx
movl 24(%rbp), %eax
addl %edx, %eax
popq %rbp
ret
.seh_endproc
.def __main; .scl 2; .type 32; .endef
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $10, -4(%rbp)
movl $20, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
movl %eax, %ecx
call add
movl %eax, -12(%rbp)
movl $10, -16(%rbp)
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"
3 汇编阶段
shell
g++ -c main.s -o main.o
作用:
将.s 文件,汇编成二进制文件
4 链接阶段
shell
g++ main.o -o main
作用:
将目标文件.o 和库文件链接,生成可执行文件