一些旧的 x86 指令在 64 位模式下未定义。例如LDS
,LES
和, 或( ) 和( ) 指令LSS
的短操作码。INC r16
40 + rw
INC r32
40 + rd
是否有任何指令仅在 64 位模式下定义,而不在 32 位保护模式下定义?
编辑: 上下文是 x86 处理器的开发。我想确保我符合规范。
一些旧的 x86 指令在 64 位模式下未定义。例如LDS
,LES
和, 或( ) 和( ) 指令LSS
的短操作码。INC r16
40 + rw
INC r32
40 + rd
是否有任何指令仅在 64 位模式下定义,而不在 32 位保护模式下定义?
编辑: 上下文是 x86 处理器的开发。我想确保我符合规范。
有一种寻址方式,在 32 位中没有对应物:指令指针相对寻址。在 32 位模式下,这仅适用于分支(也称为分支偏移),在 64 位模式下,您可以为相对于 (r)ip 的任何内存操作数形成有效地址。
所以,指令
mov rbx,$100[rip]
确实存在于 x86-64 中,而
mov ebx,$100[eip]
在 x86 中没有。
来自英特尔架构软件开发人员手册第 2C 卷附录 A(操作码映射):
表 A-1。操作码表中使用的上标
...
o64指令仅在 64 位模式下可用
...
搜索表格,以下说明与该上标一起出现:
第 5.16 节(64 位模式指令)中列出了一些附加指令,它们是现有指令的变体:
抛开现在在 64 位寄存器上运行的旧指令(它们是真正的新指令,因为它们使用不同的二进制表示),我可以想到至少两条仅 64 位的指令:syscall
和sysret
指令。
相反的更容易想出;)像 cmpxchg8b .... 你永远不会在 64 位模式下使用那个。
您可以随时查看http://www.intel.com/products/processor/index.htm?iid=dev_center+tech_hw_design+prods+processors上的不同手册以找到此类说明。会很辛苦;)
PUSHA 仅存在于 32 位模式中。它在 64 位模式下不存在