(本文是个人学习过程中的记录笔记,如有错误希望大牛帮忙指出。)
在linux下编译x.c程序时,可以将其编译为汇编程序而不链接,这样就可以看到编译后的汇编代码。
gcc对c程序的编译分为如下四个步骤:process、compile、assemble、link,分别为预处理、编译、汇编、链接。在这四个过程中,process会对头文件、注释等进行处理,生成插入头文件后的文件。compile会对process后的文件进行编译,生成汇编代码。assemble处理后会将汇编代码转换为二进制机器码,link后则是我们可以运行的c程序了。
假设main.c文件如下所示:
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
使用命令 gcc -S main.c -o main.s将main.c编译为汇编代码,生成汇编文件main.s,其内容如下:
.file "main.c"
.text
.globl g
.type g, @function
g:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl 8(%ebp), %eax
addl $3, %eax
popl %ebp