这是一篇初级文档,可能包含一些认知错误!
寄存器是CPU中的电子元件之一,使用有限的存贮容量进行高速存贮,它们可用来暂存数据、指令和地址。计算机中的存储器有五类,分别是离线存储设备、硬盘、内存、缓存和寄存器,他们的价格和存储性能如下表所示:
可以看到,寄存器的存储速度是最快的,这与CPU的物理距离和自身工作内容简单相关。他们之间的执行关系是线性的:
CPU<—->寄存器<—->缓存<—->内存<—->硬盘
访问内存时要在CPU的寄存器填上地址,再执行相应的汇编指令,这时CPU会在数据总线上生成读取或写入内存数据的时钟信号,最终内存内容会被寄存器写入或读取。
寄存器的工作方式很简单,只有两步:
- 找到相关的位
- 读取这些位
寄存器分类
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)和控制标志构成,
如下所示:
条件码:
①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