基于两种相关的机器语言:Intel IA32 和 x86-64。
32位机器只能使用大概 4GB (2^32字节) 的随机访问存储器(即内存),而目前64位机器能够使用多达 256TB(2^48字节)的内存空间。
Intel 处理器系列俗称 x86, 经历了一个长期的、不断进化的发展过程。
Linux 使用了平坦寻址方式(flat addressing)。
对于机器级编程来说,其中两种抽象尤为重要。第一种是机器级程序的格式和行为,定义为指令集体系结构(Instrucion set architecture,ISA),它定义了处理器状态、指令的格式,以及每条指令对状态的影响。第二种抽象是,机器级程序使用的存储器地址是虚拟地址,提供的存储器模型是一个非常大的字节数组。
IA32 机器代码和原始的C代码差别非常大。一些通常对C语言程序猿隐蔽的处理器状态是可见的:
- 程序计数器(在 IA32 中,通常称为“PC”,用%eip表示)指示将要执行的下一条指令在存储器中的地址。
- 整数寄存器文件包含8个命名的位置,分别存储32位的值。这些寄存器可以存储地址(对英语C语言的指针)或整数数据。有的寄存器被用来记录某些重要的程序状态,而其他的寄存器则用来保存临时数据,例如过程的局部变量和函数的返回值。
- 条件码寄存去保存着最近执行的算数或逻辑指令的状态信息。它们用来实现控制或数据流中的变化,比如说用来实现if和while语句。
- 一组浮点寄存器存放浮点数据。
程序存储器(program momery)包含:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块(比如malloc库函数分配的)。