本博客属于《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000,课程作业。刘洋原创作品,转载请注明出处。
通过分析一个c代码的汇编语言,了解计算机执行代码的过程。
一、废话不多说,登录实验楼Linux虚拟机,打开终端,输入命令vi main.c创建一个c源文件,输入i切换到插入模式,然后敲入如下代码:
输入完成后,按ESC键退出插入模式,并且输入:wq保存并且退出vi,然后在终端输入命令:gcc -S -o main.s main.c -m32将代码编译成汇编语言,并保存在main.s中,将main.s中以"."开头的语句删除,得到纯净的汇编代码,如下:
二、下面分析这段汇编代码的执行过程:
首先介绍一些几个寄存器和语句:
ebp和esp:esp是栈指针,是CPU机制决定的,push、pop指令会自动调整esp的值,又因为函数的参数和局部变量,其实是与进入函数那时的esp相关的,但由于esp在函数运行中会不停的变,因此保存当前esp到一个ebp中保持不变,后续用ebp来访问参数和局部变量就很清楚。
eax是通用寄存器,一般用来保存函数返回值。
pushl和popl,入栈和出栈。
call,将eip进行更改,改变程序的执行顺序。相当于pushl eip 和 movl (call后面的入口地址), %eip.
leave,撤销函数调用堆栈,相当于movl %ebp,%esp; popl %ebp;
具体的过程,用电脑画图比较繁琐,就不一一展示了。关键点,在于,ebp和esp的变化。