汇编:为什么有些x86操作码在x64中无效?

Bła*_*lik 5 x86 assembly x86-64 opcode opcodes

我的问题源于一个简单的好奇心:

为什么在x64中某些操作码是无效的(例如06,07),而在x86中用于相当基本的指令(06和07是推送和弹出)?我认为那些最简单的指令在两种架构中都能很好地完成.

为什么他们在x64中禁用了一些简单的指令?他们为什么不工作?为什么他们禁用某些操作码,在操作码列表中创建漏洞,何时可以将它们分配给x64版本的指令?

参考:

http://ref.x86asm.net/coder32.html

http://ref.x86asm.net/coder64.html

int*_*jay 8

32位模式下的06和07操作码是指令PUSH ESPOP ES.在64位模式下,段寄存器CS,DS,ES和SS不再用于确定存储器地址:处理器假定基址为0且没有大小限制.由于现在通常没有理由让应用程序(操作系统本身除外)访问这些寄存器,因此删除了用于更改和访问它们的操作码.

FS和GS段寄存器仍然可以在64位模式下设置基址,因此与它们相关的操作码尚未被删除.

  • @harold 你说得对,它仍然用于设置代码段的属性(例如启用 64 位模式),但不再用于确定内存地址。 (2认同)