1.机器代码
计算机执行机器代码,用字节序列编码低级的操作,包括数据处理、管理内存、读写存储设备上的数据,以及利用网络通信。
编译器基于编程语言的规则、目标机器的指令集和操作系统遵循的惯例,经过一系列的阶段生成机器代码。
汇编代码是机器代码的文本表示,给出程序中的每一条指令,然后GCC调用汇编器和链接器,根据汇编代码生成可执行的机器代码。
2.机器级代码
计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节。
对于机器级编程来说,有两种抽象尤为重要,第一种是由指令集体系结构或指令集架构(instructino set architecture,ISA)来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。大多数ISA,包括x86_64,将程序的行为描述成好像每条指令都是按顺序执行的,一条指令结束后,下一条再开始。处理器的硬件远比描述的精细复杂,它们并发地执行许多指令,但是可以采取措施保证整体行为与ISA指定的顺序执行的行为完全一致。第二种抽象是,机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来。
3.汇编代码
在整个编译过程中,编译器会完成大部分的工作,将把用C语言提供的相对比较抽象的执行模型表示的程序转化成处理器执行的非常基本的指令。汇编代码表示非常接近于机器代码,与机器代码的二进制格式相比,汇编代码的主要特点是它用可读性更好的文本格式表示。能够理解汇编代码以及它与原始C代码的联系,是理解计算机如何执行程序的关键一步。
4.操作数指示符
大多数指令有一个或多个操作数,指示出执行下一个操作中要使用的源数据值,以及放置结果的目标位置。源数据值可以以常数的形式给出,或是从寄存器或内存中读出。结果可以存放在寄存器或内存中。
操作数有三种,
第一种类型是立即数,用来表示常数值。
第二种类型是寄存器,它表示某个寄存器的内容;可以将寄存