计算机如何工作小解
计算机如何工作小解
“20135224陈实 + 自己博客园 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
汇编代码如下:
基本理解工作过程如下:
根据汇编语言:在g函数中,开头语句都是创建堆栈起始语pushl,movl分别对应下图(下右图eax值应该是算过main与F之后的esp值+5,这里只做函数顺序理解)
对应f与main开头语大同小异:
在进行到语句subl时候,ESP下移,将要保留的数值5放入(这里涉及前面ESP对应值得问题,由于是连续存储空间,所以三个函数是在堆栈中是顺序放置的,操作movl 8(%esp) ,%eax是将主函数已经放入的5的值付给了eax)
在执行完最后调用函数f之后,由于操作movl 8(%esp) ,%eax,将eax改成10,在返回到主函数的IP之后,继续执行主函数的指令,对应addl $1 eax操作,将所得数值进行最后加减得到
这与C对应是成立的
在执行完前面操作后,可以看到每个函数结尾语句:leave与ret
他们的作用相当于回收原来创建的堆栈,他们与牵头的开头语句pushl movl正好相反
先将edp弹栈,再将esp的值赋值给edp,将整个栈回复到esp=edp既开始创建阶段
注意事项:
1 堆栈有时候是可以连续而在空间不足或者文件堆放问题以及其他原因都很可能导致各函数存放位置不同,顺序也不一定连续,要根据具体情况以及汇编代码而定,关于存储问题详见《深入了解计算机系统》第九章,http://www.cnblogs.com/chuishi/p/5043201.html
2 由于是C语言面向过程,进入起始函数为主函数main(默认),所以其他调用函数应该在其后进行相应的空间分配,堆栈分配
3 汇编语言同样具有等价代替的性质,在不同的操作位以及反汇编工具等影响汇编语句不尽相同,但效果都是一样的,例如subl 对SEP的操作可以等效为pushl,都是对esp的压栈数据
其他文字概述或者汇编拓展详见:
http://www.cnblogs.com/chuishi/p/4869583.html
http://www.cnblogs.com/chuishi/p/4897808.html
总结
收获不小就简而言:初步的带领我们走进另一种操作系统LINUX的世界,一些常用的基本命令不仅方便了操作还极大地提高了学习的热情。所谓计算机,无非二进制之间的有效排列与规则制定,数据自然而然成为计算机运行的纽带。对于主要是汇编,进一步了解更基础的机器代码的同时让我感受到语言的转换需要的不仅仅是一个大脑,其次就是堆栈的概念,作为一种数据结构,可以说人类发掘计算机的可利用空间的思维实在大的可怕。进一步补充,Y86等更进一步接近计算机语言,为实现进一步深入了解计算机系统奠定基础。对于存储结构就自其硬件备受瞩目高速发展史来看,存储结构的改进以及相应材料设备等的更替把计算机运算水平推向一个又一个高峰,局部性的属性要求我们,走的是遵循计算机存储规则的道路,虽然不利于我们理解,却可以为计算机带来更好更快的运算效率。总的来说,这本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性,本书的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示到存储结构的构成。