程序的机器级表示
编译器基于编程语言的规则、目标机器的指令集和操作系统遵循的规则,经过一系列阶段产生机器代码。汇编代码的本质是机器代码的文本表示。 用高级语言编程的时候,机器屏蔽了程序的细节,即机器级实现。高级语言的抽象级别比较高,用高级语言编写的程序可以在不同的机器上实现,而汇编代码则是也特定机器密切相关的。
机器级代码
利用更简单的抽象来隐藏实现的细节。计算机系统使用了多种不同形式的抽象。
第一种抽象:机器级程序的格式和行为定义为指令集体系结构。即ISA(Instruction set architecture)。定义了处理器状态、指令的格式,以及每条指令对状态的影响。将程序的行为描述成好像每条指令是按顺序执行的,一条指令结束后,另一条指令开始。处理器的硬件远比描述的复杂而精细。但是可以保证其整体行为与ISA指定的顺序执行完全一致。
第二种抽象:机器级程序使用的存储器地址是虚拟地址。提供的存储器模型 看上去是一个非常大的字节数组。 机器代码和原始的C代码差别非常大,一些通常对C语言程序员隐藏的处理器状态是可见的:
- 程序计数器:指向下一条指令在存储器中的地址。
- 整数寄存器文件包含8个命名的位置,分别存储32位的值。这些寄存器可以存储地址或整数数据。例如过程的局部变量和函数的返回值。
- 条件码寄存器保存着最近执行的算术或逻辑指令的状态信息。他们用来实现控制或数据流中的条件变化,比如说用来实现if和while语句。
- 一组浮点寄存器存放浮点数据。
- 程序存储器包含:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块。程序存储器用虚拟地址来寻址。操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址。
- 一条机器指令只执行一个非常基本的操作。