8086 是 Intel 公司第一款 16 位处理器,诞生于 1978 年。
8086 处理器内部有 8 个 16 位的通用寄存器,分别被命名为 AX、BX、CX、DX、SI、DI、BP、SP。
这 8 个寄存器中的前 4 个,即 AX、BX、CX 和 DX,又各自可以拆分成两个 8 位的寄存器来使用,总共可以提供 8 个 8 位的寄存器 AH、AL、BH、BL、CH、CL、DH、DL。
在 8086 处理器里,有一个特殊的寄存器,叫做标志寄存器 FLAGS。
1985 年的 80386 处理器是 Intel 公司的第一款 32 位产品。
Intel 32 位处理器架构简称 IA-32(Intel Architecture,32-bit),是以 1978 年的 8086 处理器为基础发展起来的。
32 位处理器在 16 位处理器的基础上,扩展了这 8 个通用寄存器的长度
为了在汇编语言程序中使用经过扩展(Extend)的寄存器,需要给它们命名,它们的名字分别是 EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP。
另外,在 16 位处理器中,标志寄存器 FLAGS 是 16 位的,在 32 位处理器中,扩展到了 32 位,低 16 位和原先保持一致。
x86_64 架构有 16 个通用寄存器,相比 IA32 多了 8 个(r8 至 r15 是 x86_64 新增的)。
x86_64 中的一个通用寄存器有 4 种用法。以 RAX 为例:
对于通用寄存器的用途,有一些隐含的规定,有时候某些指令必须使用特定的寄存器来进行操作,例如:
x86_64 中,RFLAGS 是一个 64 位寄存器,其每一个比特位有不同的含义。其中,最常用的标记位有:
指令寄存器 RIP 包含下一条将要被执行的指令的逻辑地址。通常情况下,每取出一条指令后,RIP 会自增指向下一条指令。在 x86_64 中 RIP 的自增也即偏移 8 字节。
但是 RIP 并不总是自增,也有例外,例如 call 指令和 ret 指令。call 指令会将当前 RIP 的内容压入栈中,将程序的执行权交给目标函数;ret 指令则执行出栈操作,将之前压入栈的 8 个字节的 RIP 地址弹出,重新放入 RIP。