跳转至

通用寄存器

当汇编代码需要存储或操作任意数据时,它使用称为通用寄存器的进程寄存器子集。这些寄存器专门用来存储特定于进程的数据,比如函数的局部变量。每个通用寄存器都是 32 位,因此可以看作 DWORD 变量。通用寄存器还针对特定用途进行了优化:

EAX(累加器)(the accumulator):针对数学计算优化。某些操作(如乘法和除法)只能发生在 EAX 中。

EBX(基址寄存器)(the base register):任意用于额外存储。由于它的 16 位前身 BX 是操作可以用来引用内存地址的唯一寄存器,EBX 曾被用作 RAM 的引用。但在 x86 汇编中,所有寄存器都可以是地址引用,这让 EBX 没有真正用途。

ECX(计数器)(the counter):优化为循环中的计数器变量(高级代码中常叫 i)。

EDX(数据寄存器)(the data register):优化为 EAX 的辅助。例如,在 64 位计算中,EAX 充当位 0–31,EDX 充当位 32–63。

这些寄存器还有一组 8 位和 16 位子寄存器,你可以用来访问部分数据。把每个通用寄存器想象成一个联合,寄存器名描述 32 位成员,子寄存器是可以访问寄存器较小部分的替代成员。下面的代码展示了 EAX 的这个联合可能是什么样子:

union {
    DWORD EAX;
    WORD AX;
    struct {
        BYTE L;
        BYTE H;
    } A;
} EAX;

在这个示例中,AX 允许访问 EAX 的低 WORD,而 AL 允许访问 AX 的低 BYTE,AH 访问它的高 BYTE。每个通用寄存器都有这个结构,我在图 4-5 中列出了其他寄存器的子寄存器。

EAX、EBX、ECX 和 EDX 也有高字,但编译器几乎不会自己访问它们,因为它可以在只需要字存储时使用低字。