5#Linux内核分析#学习笔记01

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

实验步骤:

1. 在Linux下编写一个C语言程序main.c

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

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

int main(void)
{
      return f(6) + 3;
}

2. 将main.c编译成汇编语言文件main.s
gcc -S -o main.s main.c -m32

3. 去掉main.s文件中以点号"."开头的行,得到汇编代码如下:

  1    g:                              ;g()函数 
  2         pushl   %ebp                     
  3         movl    %esp, %ebp               
  4         movl    8(%ebp), %eax            
  5         addl    $2, %eax                 
  6         popl    %ebp                     
  7         ret                              
  8    f:                              ;f()函数                                                                                                                        
  9         pushl   %ebp                     
 10         movl    %esp, %ebp               
 11         subl    $4, %esp                 
 12         movl    8(%ebp), %eax            
 13         movl    %eax, (%esp)             
 14         call    g                        
 15         leave                            
 16         ret                              
 17    main:                           ;main()函数
 18         pushl   %ebp                     
 19         movl    %esp, %ebp               
 20         subl    $4, %esp                 
 21         movl    $6, (%esp)               
 22         call    f                        
 23         addl    $3, %eax                 
 24         leave                            
 25         ret     

4. 从第17行开始执行main函数

5#Linux内核分析#学习笔记01_第1张图片
初始状态:17 main:
5#Linux内核分析#学习笔记01_第2张图片
18 pushl %ebp
5#Linux内核分析#学习笔记01_第3张图片
19 movl %esp, %ebp
5#Linux内核分析#学习笔记01_第4张图片
20 subl $4, %esp
5#Linux内核分析#学习笔记01_第5张图片
21 movl $6, (%esp)
5#Linux内核分析#学习笔记01_第6张图片
22 call f
5#Linux内核分析#学习笔记01_第7张图片
9 pushl %ebp
5#Linux内核分析#学习笔记01_第8张图片
10 movl %esp, %ebp
5#Linux内核分析#学习笔记01_第9张图片
11 subl $4, %esp
5#Linux内核分析#学习笔记01_第10张图片
12 movl 8(%ebp), %eax
5#Linux内核分析#学习笔记01_第11张图片
13 movl %eax, (%esp)
5#Linux内核分析#学习笔记01_第12张图片
14 call g
5#Linux内核分析#学习笔记01_第13张图片
2 pushl %ebp
5#Linux内核分析#学习笔记01_第14张图片
3 movl %esp, %ebp
5#Linux内核分析#学习笔记01_第15张图片
4 movl 8(%ebp), %eax
5#Linux内核分析#学习笔记01_第16张图片
5 addl $2, %eax
5#Linux内核分析#学习笔记01_第17张图片
6 popl %ebp
5#Linux内核分析#学习笔记01_第18张图片
7 ret
5#Linux内核分析#学习笔记01_第19张图片
15 leave
5#Linux内核分析#学习笔记01_第20张图片
16 ret
5#Linux内核分析#学习笔记01_第21张图片
23 addl $3, %eax
5#Linux内核分析#学习笔记01_第22张图片
24 leave

5. 总结

目前绝大部分的计算机都是采用冯•诺依曼体系结构,即存储程序计算机模型。

计算机执行程序时,首先是CPU控制器从内存获得第一条指令的地址,CPU取得这个指令并执行,然后CPU控制器生成下一条要执行的指令的地址。内存中保存程序的指令和数据,ALU单元负责一些运算操作。

你可能感兴趣的:(5#Linux内核分析#学习笔记01)