Linux内核分析一:反汇编一个简单的C程序

时间:2021-10-25 00:56:42

本博客属于《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000,课程作业。刘洋原创作品,转载请注明出处。 

通过分析一个c代码的汇编语言,了解计算机执行代码的过程。

一、废话不多说,登录实验楼Linux虚拟机,打开终端,输入命令vi main.c创建一个c源文件,输入i切换到插入模式,然后敲入如下代码:

Linux内核分析一:反汇编一个简单的C程序

Linux内核分析一:反汇编一个简单的C程序

输入完成后,按ESC键退出插入模式,并且输入:wq保存并且退出vi,然后在终端输入命令:gcc -S -o main.s main.c -m32将代码编译成汇编语言,并保存在main.s中,将main.s中以"."开头的语句删除,得到纯净的汇编代码,如下:

Linux内核分析一:反汇编一个简单的C程序Linux内核分析一:反汇编一个简单的C程序

二、下面分析这段汇编代码的执行过程:

首先介绍一些几个寄存器和语句:

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的变化。