1. 不同体系结构下字位数的对比
x86 为了保持40多年的向后兼容性,把"字"固定死在了16位,无论后来的CPU发展到多少位都没改过。而大多数其他架构则更符合直觉------它们的"字"会随着CPU位宽的提升而变大。
| 数据类型 | x86 (IA-32 / x86-64) | ARM | RISC-V |
|---|---|---|---|
| Byte (字节) | 8 位 | 8 位 | 8 位 |
| Word (字) | 16 位 (历史定义,沿用至今) | 32 位 (从ARMv1到v8都如此) | 32 位 (在RV32/64/128中均指32位) |
2. x86体系结构为啥要固定字为16位
-
根源:始祖 8086 的基因设定
故事要从 1978 年 Intel 推出的 8086 处理器说起。8086 是一个 16 位处理器,其内部最重要的通用寄存器(如 AX, BX, CX, DX)都是 16 位宽。在当时,16 位就是这个 CPU 能一次性处理的最大数据单位,因此,Intel 理所当然地把 "字"定义为 16 位。这个定义在当时是教科书式的。问题在于,后来的 x86 处理器进化到了 32 位、64 位,但这个"字"的定义,作为这个庞大指令集家族最早的"基因",被完整地保留了下来。
-
本质:为兼容性而冻结的"约定"
如果 Intel 在推出 32 位处理器(386)时,把"字"的定义改成 32 位,会发生什么?
会导致术语和指令行为的灾难性断裂。一个为 8086 编写的古老汇编程序,其中一条 MOV AX, [1234] 指令的本意是"从内存地址 1234 处读取一个 16 位的字到 AX 寄存器"。如果新 CPU 把"字"理解为 32 位,它就会一次读入 32 位数据,导致程序逻辑崩溃。为了避免这种"牵一发而动全身"的灾难,Intel 做出了最稳妥的选择:将这个最基础的定义"冻结"。无论后来的 CPU 发展到多少位,"字 (Word)"这个术语,永远指代一个 16 位的数据单元。这是一种"契约":Intel 承诺"字"的含义永不改变,来换取你的旧软件可以永远运行在新硬件上。
3. ARM字也固定在32位
ARM 在从 32 位架构(ARMv7)发展到 64 位架构(ARMv8)时,将"字 (Word)"的定义固定为 32 位,其首要目的正是为了保持向后兼容性。
虽然 ARM 没有 x86 那样长达四十多年的历史包袱,但它在移动嵌入式领域积累的庞大软件生态,同样要求它必须谨慎处理兼容性问题。可以说,ARM 采取了和 x86 完全相同的策略:冻结"字"这个基础术语的定义,同时允许架构的核心位宽(字长)继续增长。
4. RISC-V 体系结构字固定位32位
在 RISC-V 架构中,"字 (Word)"的定义不是出于向后兼容性而"冻结"的,而是一个基准定义。它的设计策略更干净、更模块化:先定义好"字"为 32 位,然后允许在此基础上构建更宽的"双字 (Doubleword)"和"四字 (Quadword)"。这意味着,无论你使用的是 32 位、64 位还是 128 位的 RISC-V 处理器,一个"字"始终代表 32 位数据