E — 指令集体系结构

指令集体系结构(ISA)是软件和硬件之间的契约——它定义了 CPU 支持的所有指令、寄存器、寻址模式、数据类型。

CISC vs RISC

CISC (Complex)RISC (Reduced)
设计哲学一条指令做很多事每条指令只做简单的事
指令长度变长(1-15 字节)定长(4 字节)
指令总数约 1500+ (x86_64)约 200 (ARMv8)
寻址模式多种(寄存器、内存、间接等)load/store 架构
代表x86, x86_64ARM, RISC-V, MIPS

x86_64 虽然属于 CISC 体系,但现代 x86 CPU 内部将 CISC 指令译码为 RISC 风格的微操作(micro-ops)再放入流水线执行。因此 CISC vs RISC 的差异在微架构层面已经缩小。

x86-64 与 ARM64 的对齐

特性x86-64ARM64 (AArch64)
通用寄存器数16 (RAX, RBX, … R15)31 (X0-X30)
栈指针RSPX31 (SP)
指令编码变长 (1-15B)定长 4B
内存模型强内存模型 (TSO)弱内存模型 (有额外屏障要求)
函数调用约定System V AMD64 ABIAAPCS64

寻址模式

指令如何定位操作数:

模式示例 (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, R9X0-X7
前 N 个浮点参数XMM0-XMM7V0-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 可以被单独列出为一个学习路径。

本章与其他模块的链接