x86 操作码是任意的吗?

Are x86 opcodes arbitrary?

x86 操作码是任意的吗?

为什么 hlt 是 0xf4 而 nop 是 0x90?

此架构的早期版本 (8008,8080) 是使用极少量的 transistors/logic 门实现的。

当时,我确信设计人员选择了易于解码的操作码和指令格式(例如,门数最少)。这些说明往往很简单,格式也很规则。

(我知道我在 1970 年代设计了一个 16 位 CPU。英特尔可能做得更好,但他们总是很匆忙。我的 CPU 坚持认为 4位操作码 0000 和 1111 无效并导致陷阱;这可以防止在大多数情况下意外执行数据,因为整数值往往在其最高位全为零或全为 1)。

成功和竞争需要进化和添加新功能。 invent/add 使 CPU 能够更快更好地执行任务的新指令一直面临着压力:浮点、32 位数据、更多寄存器、SIMD 操作、加密……

随着新一代处理器的出现,随着晶体管预算的增加,设计师试图添加新指令时发生了两件事:

  • 现有的指令集已经定义了一堆模式,这些模式无法更改。因此,设计新的操作码、指令格式和操作数,不得不硬塞进指令集中的 "holes" 中。这强制了各种指令的特殊位组合
  • 更多晶体管的可用性意味着解码复杂的位模式不再是问题,因此选择奇怪的位组合并对其进行解码非常简单。

通过十几代 CPU 重复这个过程,直到你到达现代,拥有数十亿个晶体管芯片。现在添加的指令变得更加奇特,模式也变得更加复杂。它看起来很随意;它不是,但它的设计也不是很干净。

现代 x86 芯片使用指令格式所做的事情非常惊人,但它确实有效。