E — 指令集体系结构
指令集体系结构(ISA)是软件和硬件之间的契约——它定义了 CPU 支持的所有指令、寄存器、寻址模式、数据类型。
CISC vs RISC
| CISC (Complex) | RISC (Reduced) | |
|---|---|---|
| 设计哲学 | 一条指令做很多事 | 每条指令只做简单的事 |
| 指令长度 | 变长(1-15 字节) | 定长(4 字节) |
| 指令总数 | 约 1500+ (x86_64) | 约 200 (ARMv8) |
| 寻址模式 | 多种(寄存器、内存、间接等) | load/store 架构 |
| 代表 | x86, x86_64 | ARM, RISC-V, MIPS |
x86_64 虽然属于 CISC 体系,但现代 x86 CPU 内部将 CISC 指令译码为 RISC 风格的微操作(micro-ops)再放入流水线执行。因此 CISC vs RISC 的差异在微架构层面已经缩小。
x86-64 与 ARM64 的对齐
| 特性 | x86-64 | ARM64 (AArch64) |
|---|---|---|
| 通用寄存器数 | 16 (RAX, RBX, … R15) | 31 (X0-X30) |
| 栈指针 | RSP | X31 (SP) |
| 指令编码 | 变长 (1-15B) | 定长 4B |
| 内存模型 | 强内存模型 (TSO) | 弱内存模型 (有额外屏障要求) |
| 函数调用约定 | System V AMD64 ABI | AAPCS64 |
寻址模式
指令如何定位操作数:
| 模式 | 示例 (x86) | 说明 |
|---|---|---|
| 立即数 | mov eax, 42 | 操作数在指令中 |
| 寄存器 | mov eax, ebx | 操作数在寄存器中 |
| 直接 | mov eax, [0x1000] | 操作数在固定地址 |
| 寄存器间接 | mov eax, [ebx] | 操作数的地址在寄存器中 |
| 基址+变址+偏移 | mov eax, [ebx+esi*4+8] | C 语言中 arr[i+2] 的汇编形式 |
对数据结构的启示:arr[i] 在汇编层被编译为 mov eax, [base + i*size],其中 base 是数组首地址,size 是元素大小。如果 size 是 2 的幂(如 4),CPU 可以快一个周期完成地址计算。这也是为什么 4 字节、8 字节的元素大小在遍历中高性能的一个微观原因。
函数调用约定(Calling Convention)
调用约定规定:参数怎么传递、返回值怎么返回、谁负责清理栈:
| 规则 | x86-64 (System V) | ARM64 (AAPCS64) |
|---|---|---|
| 前 N 个整数参数 | RDI, RSI, RDX, RCX, R8, R9 | X0-X7 |
| 前 N 个浮点参数 | XMM0-XMM7 | V0-V7 |
| 更多参数 | 通过栈传递 | 通过栈传递 |
| 返回值 | RAX (整数), XMM0 (浮点) | X0, V0 |
| 栈清理 | 调用者负责 | 调用者负责 |
内存模型与屏障
不同 ISA 对内存访问顺序的保证不同:
| 内存模型 | 允许乱序 | 需要显式屏障 | 代表 |
|---|---|---|---|
| 顺序一致 (SC) | 否 | 否 | (理想模型) |
| 强模型 (TSO) | 允许 Store→Load 乱序 | 一般不需要显式屏障 | x86 |
| 弱模型 | 允许多种乱序 | 需要 | ARM, RISC-V, PowerPC |
对于使用 std::atomic 的代码,memory_order_release / memory_order_acquire 会在 x86 上生成一条普通的 store/load(TSO 天然符合 acquire/release),但在 ARM 上编译出 dmb 屏障指令。这又说明:相同的 C/C++ 代码,在不同架构上生成的汇编指令不同,且都遵守 C++ 内存模型。
系统寄存器(简列)
除通用寄存器外,还有控制 CPU 行为的系统寄存器:
| 寄存器 (x86) | 含义 |
|---|---|
| CR0 | 控制保护模式/分页等系统模式 |
| CR3 | 页表基地址(每个进程切换时更新) |
| EFER | 启用长模式(long mode,即 64-bit 模式) |
| IDTR | 中断描述符表(IDT)地址 |
| GDTR | 全局描述符表(GDT)地址 |
扩展阅读:RISC-V — 一个开放的 ISA
RISC-V 是一个开源的 RISC 指令集体系结构(BSD 许可)。近年来它在学术界、嵌入式领域、甚至数据中心(如 SiFive、Ventana)中快速崛起。
与需要支付许可证费的 ARM ISA、以及被 Intel/AMD 双头垄断的 x86 ISA 不同,RISC-V 允许任何人在没有授权费用的情况下设计和制造兼容 CPU。它的设计目标是模块化和可扩展性:
| 模块 | 说明 |
|---|---|
| RV32I / RV64I | 基础整数指令集(必须实现) |
| M | 乘除法扩展 |
| A | 原子操作扩展 |
| F / D | 单/双精度浮点扩展 |
| C | 压缩指令扩展(16 位短指令) |
| V | 向量扩展(类比 AVX) |
RISC-V 在国内也备受关注——它是国内 CPU 自主化的重要路径(如中科院”香山”处理器)。作为教程的潜在扩展方向,RISC-V 可以被单独列出为一个学习路径。