这是一篇初级文档,可能包含一些认知错误!
寄存器是CPU中的电子元件之一,使用有限的存贮容量进行高速存贮,它们可用来暂存数据、指令和地址。计算机中的存储器有五类,分别是离线存储设备、硬盘、内存、缓存和寄存器,他们的价格和存储性能如下表所示:

X86 寄存器 - 图1

可以看到,寄存器的存储速度是最快的,这与CPU的物理距离和自身工作内容简单相关。他们之间的执行关系是线性的:

CPU<—->寄存器<—->缓存<—->内存<—->硬盘

访问内存时要在CPU的寄存器填上地址,再执行相应的汇编指令,这时CPU会在数据总线上生成读取或写入内存数据的时钟信号,最终内存内容会被寄存器写入或读取。
寄存器的工作方式很简单,只有两步:

  1. 找到相关的位
  2. 读取这些位

    寄存器分类

    32位寄存器

    8个通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP
    1个标志寄存器:EFLAGS
    6个段寄存器:CS、DS、ES、FS、GS、SS
    5个控制寄存器:CR0、CR1、CR2、CR3、CR4
    8个调试寄存器:DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7
    4个系统地址寄存器:GDTR、IDTR、LDTR、TR
    其他寄存器:EIP、TSC等。

    64位寄存器

    操作模式表
操作模式 操作系统 应用需要重新编译 Defaults 寄存器扩展 Typical
地址长度 操作数长度 通用寄存器长度 (位, bit)
Long Mode 64位模式 64-bit OS 64 32 64
兼容模式 32 32
16 16 16
Legacy Mode Protected Mode Legacy 32-bit OS 32 32 32
16 16
Virtual-8086 Mode 16 16 16
Real Mode Legacy 16-bit OS

寄存器和栈

寄存器或栈 Legacy和兼容模式 64位模式
名称 数量 大小 (bits) 名称 数量 大小 (bits)
通用寄存器(GPR)
EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP

8 |

32 | RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8–R15 |

16 |

64 | | 256位YMM 寄存器 | YMM0–YMM7 | 8 | 256 | YMM0–YMM15 | 16 | 256 | | 128位XMM寄存器 | XMM0–XMM7 | 8 | 128 | XMM0–XMM15 | 16 | 128 | | 64位MMX寄存器 | MMX0–MMX7 | 8 | 64 | MMX0–MMX7 | 8 | 64 | | x87寄存器 | FPR0–FPR7 | 8 | 80 | FPR0–FPR7 | 8 | 80 | | 指令指针寄存器 | EIP | 1 | 32 | RIP | 1 | 64 | | 标志寄存器 | EFLAGS | 1 | 32 | RFLAGS | 1 | 64 | | Stack | — | | 16 or 32 | — | | 64 | | 注解:
1. 灰色阴影的条目表示模式之间存在差异,这些差异(栈堆宽度差异除外)是由于AMD64架构的寄存器扩展之后出现的。
1. 通用寄存器使用其全角名称列出。 在传统和兼容模式下,也可以访问寄存器的 16 位和 8 位映射。 在64位模式下,可以访问寄存器的32 位、16位和8位映射。 见第 3.1 节,23 页上的“寄存器”。
1. XMM寄存器覆盖 YMM 寄存器的低八字。 见第 4.2 节,113 页的“寄存器”。
1. MMX0-MMX7 寄存器映射到FPR0-FPR7物理寄存器,如图 1-1 所示。 x87 栈堆寄存器 ST(0)–ST(7) 是 FPR0–FPR7 物理寄存器的逻辑映射。
1. 本图表摘录自AMD公司出品的《AMD64架构程序员手册》一书。
| | | | | | |

标志(状态)寄存器

PSW(Program Status Word)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,
如下所示:
X86 寄存器 - 图2
条件码:
①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配。
②SF(Sign Flag)符号标志,结果为负时置1,否则置0。
③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0。
④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位。
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
有进位时1,否则置0。
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0。
控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。
test和cmp指令运行后都会设置标志位,为举例方便说一下jnz和jz
测试条件
JZ ZF=1
JNZ ZF=0
即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)
Jnz=jump if not zero