学过计算机组成原理的同学可能对计算机的工作过程有一定的了解了。计算机的工作过程,笼统地讲就是程序的执行过程。现在,我们通过反汇编一个简单的C程序,逐步分析汇编代码,来了解程序是怎样工作的。
准备一个C程序
int g( int x ) { return x + 7; } int f( int x ) { return g(x); } int main(void) { return f(11) + 1; }
使用如下命令得到汇编代码
gcc -S -o main.S main.c -m32
命令中的参数意义:
-S :表示生成汇编代码
-m32 :表示生成32位格式
生成的汇编代码如下
为了简洁,删掉了其中的一些辅助信息
分析汇编代码
大家知道,程序是从main处开始执行的,我们就先来看看main函数的汇编码。
首先看这两行
pushl %ebp
movl %esp, %ebp
可以发现,三段代码开头都是这两句。将栈基指针压栈,再将栈基指针指向栈顶,这么做的用意是保存当前基址,并开始一个新的栈,每个函数就有独立的栈空间。当函数返回时,能恢