linux内核分析--计算机是如何工作的
2016-02-27 00:13
309 查看
实验部分
使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码。源代码如下:
int g(int x) { return x + 9; } int f(int x) { return g(x); } int main(void) { return f(18) + 11; }
编译后的代码如下:
g: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $9, %eax popl %ebp ret f: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax movl %eax, (%esp) call g leave ret main: pushl %ebp movl %esp, %ebp subl $4, %esp movl $18, (%esp) call f addl $11, %eax leave ret
堆栈变化过程
1.main函数--pushl %ebp + movl %esp,%ebp2.main函数--subl $4,%esp + movl $18,(%esp)
3.main函数--call f
4.f函数--pushl %ebp + movl %esp,%ebp
5.f函数--subl $4,%esp + movl 8(%ebp),%eax + movl %eax, (%esp)
6.f函数--call g
7.g函数--pushl %ebp + movl %esp, %ebp + movl 8(%ebp), %eax
8.g函数--addl $9,%eax + popl %ebp
9.g函数--ret 下一步将运行第15行的指令也就是f函数的leave指令
10.f函数--leave
11.f函数--ret 下一步将运行第23行的指令也就是main函数的addl指令
12.mian函数--addl $11, %eax + leave
13.main函数--ret 取决于在初始堆栈中的情况。
实验楼截图
计算机如何工作的理解
计算机首先从内存中运行第一条指令,根据其指令的内容及要求,从存储器中取出相应的数据并进行运算和操作,最后根据地址将结果返回到内存之中,从而完成一条指令的运行。若有第二条指令,则会进行相同的步骤,直至出现停止的指令,则停止工作。简单点说,就是不断地取指令和运行指令,最后将结果返回至已指定的存储器地址之中。
需要注意的是计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令。
池彬宁原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
相关文章推荐
- 计算机中的数与数据
- 第一周 计算机是如何工作的
- python 网络爬虫初级实现代码
- cell 网络数据缓存
- 自己综合的一个常用下载和上传工具类:HttpClientUtils(18)
- Netty精粹之TCP粘包拆包问题
- I/O复用的高级应用三:同时处理TCP和UDP服务
- C++数据结构 简单栈 (一贯作风::懒)
- C++数据结构 乱搭配模板迭代
- Android中不能使用HttpClient了
- HTTP Live Streaming for iPhone/iPad(HLS流媒体服务器)
- 运行中的计算机
- http://www.cnblogs.com/yjf512/p/3164400.html
- Charles 3.11.2 手机代理查看HTTPS方法
- http://www.oschina.net/translate/elasticsearch-getting-started?cmp
- 1-1-绪论-第1章-《数据结构》课本源码-严蔚敏吴伟民版
- vs2013+Qt5 , 模块计算机类型“X86”与目标计算机类型“x64”冲突
- 《数据结构》进行曲--带头结点的单循环链表的基本操作
- 针对"您的计算机配置似乎是正确的,但该设备或资源(DNS 服务器)没有响应"问题解决
- 计算机是如何工作的