一篇文章看懂 CPU 里那些「小格子」:能存几位、长啥样、都在哪
打个比方:触发器像「一个格子」,寄存器像「一整排格子」。一排有多少个格子,就是寄存器的「位宽(bit width)」。
上图:上面那一个蓝框是「1 位触发器」,下面那排 8 个橙框拼起来才是「一个 8 位寄存器」。格子下方标的是「位序号」(bit 7 是最高位,bit 0 是最低位)。
寄存器能存多少位,取决于这颗 CPU 的字长(word size)——也就是它「一次能方便处理多少位数据」。
| 年代 / 类型 | 典型位宽 | 说明 |
|---|---|---|
| 早期 8 位机(如 6502) | 8 位 | 一个寄存器存 1 个字节 |
| x86 实模式 / 80286 | 16 位 | AX、BX 这些寄存器是 16 位 |
| IA-32(x86-32) | 32 位 | EAX、EBX 是 32 位 |
| 现代 PC / 手机(x86-64、ARM64) | 64 位 | RAX、X0 是 64 位 |
| 向量 / SIMD 寄存器 | 128 / 256 / 512 位 | MMX、SSE、AVX、AVX-512,一次并行算很多个数 |
| 浮点 / 特殊寄存器 | 80 位 / 更宽 | x87 浮点寄存器内部常是 80 位扩展精度 |
注意区分两个「位」:① 寄存器位宽(一次能存多少位);② 寄存器数量(CPU 里有多少个寄存器)。这俩不是一回事。一个 64 位 CPU 通常也只有 十几到几十个通用寄存器(x86-64 有 16 个通用寄存器,ARM64 有 31 个)。
就是一排格子,每个格子放一个比特。下图为「一个 64 位寄存器」,把它当成一个能装 64 个小灯泡的盒子:
寄存器在硅片上由很多个「D 触发器」组成。每个 D 触发器在时钟跳变时把输入 D 锁存到输出 Q,于是数据就被「记住」了。一排 D 触发器 + 共享的时钟线,就是一个寄存器。
在 CPU 芯片里,所有寄存器集中放在一个叫 寄存器堆(Register File) 的小方块里——它就在运算单元(ALU)旁边,离得极近,所以访问几乎「零延迟」。
通用寄存器、PC、FLAGS、栈指针等,最快、最贵、最少。这是大家平时说的「寄存器」。
GPU 里有成百上千个「线程寄存器」,每个计算核心都有自己的寄存器文件,位宽也常是 32/64 位。
网卡、硬盘控制器、显卡的「控制寄存器」被映射到内存地址,CPU 读写这些地址就是在读写设备寄存器。叫「内存映射 I/O」。
浮点单元(FPU)、SIMD 单元、加密引擎内部也都有寄存器。还有系统里的「模型专用寄存器(MSR)」。
| 类别 | 例子 | 干啥用 |
|---|---|---|
| 通用寄存器 | x86: RAX/RBX/RCX…;ARM: X0–X30 | 存临时数据、运算数、返回值,程序随手用 |
| 程序计数器 | PC / RIP | 指向下一条要执行的指令地址 |
| 指令寄存器 | IR | 存当前正在执行的指令 |
| 标志寄存器 | FLAGS / EFLAGS | 存运算结果的状态(进位、零、负数、溢出…) |
| 栈指针 | SP / RSP | 指向当前栈顶 |
| 段/基址寄存器 | CS/DS/SS(x86) | 内存分段、寻址用 |
| 浮点/向量 | XMM/YMM/ZMM, FPU ST | 浮点运算、并行 SIMD 计算 |
专用寄存器(PC/IR/FLAGS/SP)大多「看不见摸不着」——你写高级语言时根本不用管它们,是 CPU 自己运转的「内部零件」。
因为离 CPU 最近、速度最快、但最贵、容量最小。存储层级就像金字塔:
寄存器容量通常用字节算都嫌大——一个 64 位寄存器才 8 字节。整颗 CPU 的通用寄存器加起来往往也就几百字节。而内存是 GB 级别,差了上百万倍。正因如此,编译器会拼命把「热数据」塞进寄存器,这才是程序快的关键之一。
在 64 位 x86(你电脑里大多数情况)上,通用寄存器长这样,而且「老名字」还能取低位用:
| 64 位 | 32 位(低) | 16 位(低) | 8 位(低) | 含义 |
|---|---|---|---|---|
| RAX | EAX | AX | AL / AH | 累加器,常存返回值 |
| RBX | EBX | BX | BL / BH | 基址 |
| RCX | ECX | CX | CL / CH | 计数(循环) |
| RDX | EDX | DX | DL / DH | 数据 |
| RSP | ESP | SP | SPL | 栈指针(专用) |
| RIP | EIP | IP | — | 指令指针(PC) |
注意:RAX 是 64 位整 registers;它的低 32 位叫 EAX,低 16 位叫 AX,AX 又分高 8 位 AH、低 8 位 AL。同一个物理寄存器可以按不同「宽度」来访问——这就是位宽灵活性的体现。
mov rax, 5 ; 把立即数 5 写入 64 位寄存器 RAX