x86 操作码是任意的吗?
有没有理由hlt
是 0xf4 并且nop
是0x90吗?
该架构的早期版本(8008,8080)是使用极少量的晶体管/逻辑门来实现的。
当时,我确信设计者以易于解码的方式选择了操作码和指令格式(例如,最少的门数)。这些说明往往很简单,格式也很规则。
(我知道我在 1970 年代设计了 16 位 CPU。Intel 可能做得更好,但他们总是很匆忙。我的 CPU 坚持认为 4 位操作码 0000 和 1111 无效并导致陷阱;这阻止了在大多数情况下,数据会被意外执行,因为整数值往往全为零或最高位为 1)。
成功和竞争需要不断发展和添加新功能。发明/添加新指令使 CPU 能够更快更好地完成任务的压力始终存在:浮点、32 位数据、更多寄存器、SIMD 操作、加密……
随着新一代处理器的出现,以及更大的晶体管预算,当设计人员试图添加新指令时,发生了两件事:
- 现有的指令集已经定义了一堆模式,并且这些模式无法更改。因此,设计新的操作码、指令格式和操作数,必须塞进指令集中的“漏洞”中。这迫使各种指令使用特殊的位组合
- 更多晶体管的出现意味着解码复杂的位模式不再是一个问题,因此选择奇怪的位组合并对其进行解码非常简单。
通过十几代 CPU 重复这个过程,直到到达现代,拥有数十亿个晶体管芯片。现在添加的指令变得更加奇特,模式也变得更加复杂。它可以看起来任意;事实并非如此,但它的设计也不够干净。
现代 x86 芯片对指令格式的处理非常令人惊叹,但它确实有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)