通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

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

计算机是如何工作的,简单来说我们都知道冯诺依曼这个名词,专业来讲,就是指存储程序计算机。

下面我们通过汇编一个简单的c语言程序 ,来说明在计算机内部的堆栈式如何变化的。

图1为这个简单的C语言程序。

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第1张图片图1

图2为汇编后的汇编代码

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第2张图片图2

首先程序从main开始执行,

eip=18,

eip逐步加1,除非遇到call指令

18 pushl %ebp             ebp的值 0 入栈  ebp=o esp=1

19 movl %esp,%ebp     ebp=esp=1

20 subl  $4,%esp          esp=2

21 movl $7,(%esp)        7入栈

22 call f                        eip(23)入栈   esp=3 eip=f=8

9  pushl %ebp               ebp1入栈      esp=4

10 movl %esp,%ebp      ebp=esp=4

11 subl  $4,%esp           esp=5

12 movl 8(%ebp),%eax   eax=7

13 movl %eax,(%esp)     7入栈

14 call g                        eip(15)入栈   esp=6 eip=g=1

2  pushl %ebp                ebp4入栈      esp=7

3  movl %esp,%ebp        ebp=esp=7

4  movl 8(%ebp),%eax    eax=7

5  addl $4,%eax             eax=7+4=11

6  popl %ebp                  ebp=4        esp=6

7  ret                             eip(15)出栈  esp=5

15 leave                        esp=ebp=4  (popl %ebp)  ebp=1  esp=3

16 ret                            eip(23)出栈  esp=2

23 addl $1,%eax            eax=11+1=12

24 leave                       esp=ebp=1   (popl %ebp)  ebp=0  esp=0

25 ret                          返回之前的eip

到这整个程序就运行完了,

下图为堆栈的详细变化图,(手画的)

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第3张图片

最后来说明下我对计算机是如何工作的之理解,通过上述对计算机堆栈的变化的详细解说,我认为计算机主要是通过高级语言比如c语言由计算机操作系统汇编成机器语言即汇编语言,在cpu中由ip计数器从内存中依次读取存储的代码或程序,通过堆栈的不断入栈出栈和寄存器内值变化,来返回不同的值,也就是程序的运行结果,再通过图形转换便显示出了最后的我们所看到的东西。

 

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

 

你可能感兴趣的:(通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的)