作者 水云青
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
基本的汇编知识:movl,subl,pushl,topl,ret,addl,leave,enter等
下面分析一个C程序来,阐述计算机是如何运行C语言的。
int g(int x)
{
return x + 20;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
以下为其生成的汇编代码,以Linux 64位机器为例:
在linux终端输入命令:
gcc –S –o main.s main.c -m32
其中-m32指的是生成32位机器的汇编,32位和64位略有不同。
生成如图汇编代码,其中以点开头的汇编码不执行,图中略去了。
C语言的都是从mian函数开始运行的,同理,汇编也是从main函数开始运行的,下面我们来从main函数入手。
首先执行的是18行pushl指令,
先画出内存的栈此时的情况:esp和ebp此时都指向栈底。
pushl %ebx指令相当于
subl $4, %esp
movl %ebx,(%esp)
1. 执行pushl %ebx之后变为:
2. 执行movl %esp, %ebp
3.执行subl $4, %esp
4. movl $8, (%esp)
5. call f
call f等价于
pushl %eip(*)
movl f %eip
执行完毕后
6. pushl%ebp
7.movl %esp, %ebp
8.subl $4,%esp
9.movl 8(%ebp), %eax
10.movl %eax, (%esp)
11.call g
12. pushl %ebp
13. movl %esp, %ebp
14. movl 8(%ebp), %eax
15. addl$20, %eax
16.popl %ebp
17. ret
18. leave
19. ret
20. addl$1, %eax
21. leave
22. main函数运行结束,将exa的值返回,即29