您的位置:首页 > 理论基础

深入理解计算机系统(第二版)----之三:(一:程序的结构和执行)程序的机器级表示

2017-03-31 20:29 1116 查看
计算机执行机器代码,用字节编码低级的操作,包括处理数据、管理存储器、读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,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)在修改一个被调用者保存寄存器之前,函数需要保存他的状态

栈是一个具有以上属性的动态内存区域。

计算设计系统中内存的堆和栈是在程序运行过程中计算机用于分配资源的两个区域

计算机系统在程序运行时会将程序映射到内存中,其中运行时分为5个区:栈区、堆区、(bass区、数据区)、代码区

栈区用于存放局部变量,临时变量,传递到函数中的参数,是系统自动分配的。
堆区用于动态分批内存

3.8 数组分配和访问

3.9 异质的数据结构

3.10 指针

3.11GDB调试器

3.12 存储器的越界引用和缓冲区溢出

3.13 扩展IA32到64位 3.14 浮点程序的机器级表示

3.14 小结

程序变量是在运行时栈中,还是在某个动态分配的数据结构中,还是在某个全局存储位置中。理解程序如何映射到机器上会理解这些存储器的差别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: