本篇博客由 张健 原创作品转载 请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
计算机是如何工作的,简单来说我们都知道冯诺依曼这个名词,专业来讲,就是指存储程序计算机。
下面我们通过汇编一个简单的c语言程序 ,来说明在计算机内部的堆栈式如何变化的。
图1为这个简单的C语言程序。
图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语言由计算机操作系统汇编成机器语言即汇编语言,在cpu中由ip计数器从内存中依次读取存储的代码或程序,通过堆栈的不断入栈出栈和寄存器内值变化,来返回不同的值,也就是程序的运行结果,再通过图形转换便显示出了最后的我们所看到的东西。
本篇博客由 张健 原创作品转载 请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000