Intel 80x86 CPU的寄存器可以分成四类:通用寄存器、特殊目的寄存器、段寄存器以及特殊目的核心模式寄存器。本书不会介绍最后两类寄存器。段寄存器在现代的32位操 作系统(例如:Windows,BeOS和Linux)当中用得不多;由于本书是专门针对32位操作系统所编写的程序,所以不需要讨论段寄存器。特殊目的 核心模式寄存器专门用来编写操作系统、调试器以及其他系统级工具。这些软件的构建远远超出了本书的范围,所以也无需讨论特殊目的核心模式寄存器。
80x86(Intel系列)CPU提供了几个通用寄存器。其中包含八个32位寄存器,如下所示:
EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP
每个名称的前缀‘E’代表扩展(extended)的意思。该前缀将32位寄存器与如下所示的八个16位寄存器区分开来:
AX、BX、CX、DX、SI、DI、BP、SP
最后,80x86 CPU还提供了八个8位的寄存器,它们的名称如下所示:
AL、AH、BL、BH、CL、CH、DL、DH
遗憾的是,这些并非都是分离的寄存器。即80 x 86并未提供24个独立的寄存器。实际上,80x86将16位寄存器重叠于32位寄存器之上,也将8位寄存器重叠于16位寄存器之上。图给出了这种关系。
EFLAGS是一个32位寄存器,它包含几个1位的布尔值(true/false)。EFLAGS寄存器中的大多数要么是为核心模式(操作系统)函数保留的,要么就是程序员不感兴趣的。其中有8位(或标志)是程序员编写汇编语言程序需要用到的。它们分别是溢出标志、方向标志、中断禁止标志(应该在第9位,参见http://en.wikipedia.org/wiki/FLAGS_register_(computing) )、符号标志、零标志、辅助进位标志、奇偶标志以及进位标志。图显示了EFLAGS寄存器低16位中标志的布局情况。
在应用程序员感兴趣的8个标志中,有4个标志特别重要:溢出标志、进位标志、符号标志以及零标志。这4个标志统称为条件码 。根据这些标志的状态就可以测试前一次计算的结果。例如,在对两个值进行比较以后,条件码标志就会告诉您其中一个值是小于,等于还是大于另一个值。
令汇编语言初学者惊讶的一个重要事实是,在80x86 CPU中进行的所有计算几乎都和寄存器有关。例如,将两个变量相加,把它们的和存入第3个变量中,必须先将其中一个变量装入一个寄存器中,并将第2个操作 数和寄存器的值相加,然后将寄存器中的值存入目的变量。寄存器在每次计算中都充当媒介。因此,在80x86汇编语言程序中寄存器是非常重要的。
还有一点很重要,虽然某些寄存器被称为是“通用”的,但并不能就此推断每个寄存器都能随意 使用。以寄存器对SP/ESP为例,它们就有特殊的目的,而不能用于任何其他的目的(它们是栈指针)。同样,寄存器BP/EBP也具有特殊目的,它们的使 用受到限制而无法当作通用寄存器使用。所有80x86寄存器都有它们自己特殊的目的,因此它们都限定在一个范围内使用。目前,您应该避免将ESP和EBP 寄存器用于一般的计算当中;还应该记住,余下的寄存器在程序中不可以完全互换。