《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

时间:2021-12-22 00:56:16

杨新峰原创作品转载请注明出处  《Linux内核分析》 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

实验环境:实验楼网站64位linux虚拟机

源码如下:

int g(int x){
return x+5;
}

int f(int x){
return g(x);
}

int main(){
return f(6)+2;
}

使用

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

编译并查看汇编源码。

将得到的汇编源码中前面带“.”符号的语句删去,得到精简的汇编代码,如下图

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程


这段代码在内存中的工作情况:

首先分析main函数代码段,假设ebp起始指向1000;

内存示意图:

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

18:pushl %ebp  ;将ebp压栈

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

19:movl %esp,%ebp  ;将esp的值赋给ebp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

20:subl $4,%esp  ;esp-4

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

21:movl    $6,(%esp)

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

22:call  f  相当于movl f(f标记的地址),%eip;

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

9:pushl %ebp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

10:movl    %esp,%ebp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

11:subl    $4,%esp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

12:movl    8(%ebp),%eax

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

13:movl    %eax,(%esp)

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

14:call    g

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

2:pushl   %ebp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

3:movl    %esp,%ebp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

4:movl    8(%ebp),%eax

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

5:addl    $5, %eax

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

6:popl    %ebp

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

7:ret  相当于popl %eip

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

15:leave 相当于movl %ebp,%esp;  popl %ebp;

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

16:ret 

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

23:addl    $2, %eax

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

24:leave

《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程

25:ret