首页 > 代码库 > 深入理解计算机系统(第二版)----之三:程序的机器级表示
深入理解计算机系统(第二版)----之三:程序的机器级表示
计算机执行机器代码,用字节编码低级的操作,包括处理数据、管理存储器、读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,gcc c语言编辑器以汇编代码的形式输出,汇编代码是机器代码的文本表示,给出程序的每一条指令。然后gcc调用汇编器和链接器,根据汇编代码生成可执行的机器代码。
本章,近距离观察机器代码和汇编代码。
机器级的实现,被高级语言屏蔽了,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的。
3.1 历史观点
3.2 程序编码
3.2.1 机器级代码
计算机系统使用了多种不同形式的抽象,利用抽象模型隐藏实现的细节,对于机器级编码来说,两种抽象非常重要,
1)机器级程序的格式和行为,定义为指令集体系结构(ISA)
2)机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是非常大的字节数组,存储器系统的实际实现,是将多个硬件存储器和操作系统软件组合起来。
IA32机器代码和原始C代码差别很大,一些通常对C语言隐藏的处理器状态是可见的:
1)程序计数器 pc 用%eip表示,指示将要执行的下一条指令在存储器中的地址
2)整数寄存器文件 8个命名的位置,
3)条件码寄存器:最近执行的算术或者逻辑指令的状态信息,用来实现控制或数据流中的条件变化,比如用来实现if 和while语句
4)一组浮点寄存器存放浮点数据
机器代码吧存储器看成一个很大的按照字节寻址的数组。
5)程序存储器 包含程序的可执行机器代码,操作系统需要的一些信息,过程调用和返回的栈,用户分配的存储器块。
程序存储器用虚拟地址来寻址,操作系统负责管理虚拟地址空间,把虚拟地址翻译成实际处理器存储器中的物理地址。
3.2.2 代码示例
3.2.3 关于格式的注解
3.3 数据格式
3.4 访问信息
3.5 算术和逻辑操作
3.6 控制
3.7 过程
一个过程调用包括吧数据(以过程参数和返回值的形式)和控制,从代码的一部分传递到另一部分。另外,他还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间,数据传递 局部变量的分配 释放,通过操纵程序栈来实现。
IA32程序用程序栈来支持过程调用,机器用栈传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的哪部分栈称为栈帧(satck frame)。寄存器%ebp为帧指针,寄存器%esp为栈指针。
许多编译后的函数并不需要栈帧,如果所有的局部变量都能保存在寄存器中,而且这个函数也不会调用其他函数,那么需要栈额唯一原因就是用来保存返回地址。
使函数需要栈的原因如下:
1)局部变量太多,不能都放在寄存器中
2)有些局部变量是数组或者结构
3)函数用取地址操作符(&)来计算以各局部变量的地址
4)函数必须必须把站上的某些参数传递到另一个函数
5)在修改一个被调用者保存寄存器之前,函数需要保存他的状态
3.8 数组分配和访问
3.9 异质的数据结构
3.10 指针
3.11GDB调试器
3.12 存储器的越界引用和缓冲区溢出
3.13 扩展IA32到64位 3.14 浮点程序的机器级表示
3.14 小结
程序变量是在运行时栈中,还是在某个动态分配的数据结构中,还是在某个全局存储位置中。理解程序如何映射到机器上会理解这些存储器的差别。
深入理解计算机系统(第二版)----之三:程序的机器级表示