1.1.1 32位架构
32位x86架构的CPU有8个32位的通用寄存器,在汇编语言中可以通过名称直接引用这8个寄存器。按照Intel指令编码中的编号和名称如表1-1所示。
表1-1 Intel指令编码中8个通用寄存器的编号和名称
其中编号为0~3的4个寄存器还可以进一步拆分。如图1-1所示,EAX的低16位可以单独使用,引用名称为AX,而AX又可以进一步拆分成高字节的AH和低字节的AL两个8位寄存器。
图1-1 EAX寄存器的结构
EAX、ECX、EDX和EBX寄存器都是按照表1-2所示的方式设计的。这种设计让开发者能够非常方便地对不同大小的数据进行操作。
表1-2 编号为0~3的寄存器的结构设计
编号为4~7的4个寄存器,低16位也有独立的名称,但是没有对应的8位寄存器,如表1-3所示。可以认为这4个16位寄存器是为了向前兼容16位的8086,在32位的程序中很少使用。
表1-3 编号为4~7的寄存器的结构设计
有些通用寄存器是有特殊用途的:
(1)EAX寄存器会被乘法和除法指令自动使用,通常称为扩展累加寄存器。
(2)ECX被LOOP系列指令用作循环计数器,但是多数上层语言不会使用LOOP指令,一般通过条件跳转系列指令实现。
(3)ESP用来寻址栈上的数据,很少用于普通算数或数据传输,通常称为扩展栈指针寄存器。
(4)ESI和EDI被高速内存传输指令分别用来指向源地址和目的地址,被称为扩展源索引寄存器和扩展目标索引寄存器。
(5)EBP在高级语言中被用来引用栈上的函数参数和局部变量,一般不用于普通算数或数据传输,称为扩展帧指针寄存器。
除了这些通用寄存器之外,还有一个标志寄存器EFLAGS比较重要。汇编语言中用于比较的CMP和TEST会修改标志寄存器里的相关标志,再结合条件跳转系列指令,就能实现上层语言中的大部分流程控制语句,此处不进一步展开。
最后还有一个很重要而且很特殊的寄存器,即指令指针寄存器EIP。指令指针寄存器中存储的是下一条将要被执行的指令的地址,而且汇编语言中不能通过名称直接引用EIP,只能通过跳转、CALL和RET等指令间接地修改EIP的值。