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 芯片使用指令格式所做的事情非常惊人,但它确实有效。
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 芯片使用指令格式所做的事情非常惊人,但它确实有效。