繁体   English   中英

Intel手册中NE和I有什么区别?

[英]What is the difference between N.E. and I in Intel manual?

Intel 的 Intel 64 和 IA-32 指令集手册第 3.1.1.5 节中,它在指令汇总表中引入了 64/32 位模式列。

对于 64 位模式支持,它说:

  • 我 - 不支持
  • NE - 表示指令语法在 64 位模式下不可编码(它可能代表其他模式下有效指令序列的一部分

指令在 64 位模式下不可编码和指令在 64 位模式下不受支持有什么区别?

目前还不完全清楚英特尔正在做出什么样的区分,或者为什么做出这种区分1是有用的。 看起来 Invalid 仅用于将 #UD(非法指令错误)的操作码,这就是为什么即使在没有其他方法使用该操作数大小对指令进行编码的情况下,它们也使用 NE。

NE ...它可能代表其他模式下有效指令序列的一部分

这是有道理的,如果他们说“在这种模式下”,我认为与他们的文档相匹配。 例如0x1F在 64 位模式下不是有效的操作码或前缀,但在其他模式下意味着pop ds

脚注 1 :当然,#UD 故障并没有面向未来的保证——未来 CPU 上的未来 ISA 扩展可以将未使用的操作码重新用于 64 位模式下的某些东西,有效地将 Invalid 更改为 NE(#UD 的面向未来的方式是0F 0B操作码,记录为ud2


Invalid 的一个示例是 64 位模式下的aam (立即除法) :在该模式下根本没有对指令进行编码,并且操作码未使用。

NE 的一个示例是inc r32短格式 0x40+rd ,它被 64 位模式重新利用(连同 0x48+rd dec )作为 REX 前缀。 inc eax也是可编码的,但不能使用操作码。

同样, inc r/m64被列为兼容/传统模式的 NE; 即它仅在长模式下可用,通过 REX 前缀。

pop在一个表中有这两种类型的示例:

  • 不再有任何方法可以使用任何操作数大小来执行pop ds (或 ES/SS),并且这些操作码被释放以供将来使用,因此它在 64 位模式下是“无效的”。 (除了一些未记录的/早期的 8086 之外,pop cs 从未有效;只有像 retf 这样将 CS:[ER]IP 设置在一起的东西,而不仅仅是 CS。)
  • pop fs和 GS 可以使用 16 位或 64 位操作数大小,但不能使用 32 位,所以
    " 0F A1 POP FS ... 将栈顶弹出到 FS;将栈指针递增32 位"
    表的行有 64 位模式的 NE,对兼容/旧版有效。 而... by 64 bits行是相反的,对 64 有效,对 32 无效。(有趣的是,当 RSP 以字节而不是位计数时,他们写的是“by 64 bits”而不是“by 8”。)

pop r32pop r/m32都被列为 64 位模式的 NE,但并非无效,尽管在该模式下无法对pop eaxpop dword [rdi]进行编码。 所以看起来 Invalid 是关于操作码,而不是指令。

(对于默认为 64 的操作码,即使 REX.W=0 也不会将操作数大小覆盖为 32 位,但66操作数大小的前缀确实可以像往常一样使 push/pop 变为 16 位。尽管如此说操作数大小的“描述”文本可能会被 REX.W 覆盖——这似乎是在谈论一般的指令,正如当前代码段的 D 标志所暗示的那样。)

也许是因为 64 位模式仍然可以使用相同的操作码弹出其他 2 种大小(64 位或 16 位)? 或者其他 2 种尺寸的 r/m 与流行音乐? 例如pop axpop word [rdi]在 64 位模式下有效,当然还有pop rax

这与他们列出pop ds的方式一致。


我想知道movsxd r64, r/m32在 16/32 位模式下是否无效或 NE,因为相同的操作码在 64 位模式之外具有不同的含义(ARPL r,r/m16 - Z80791B3AE7002CB88C246876D9FAA8F x86asm.net/coder32.html#x63 )。

但它只是 NE 用于 32 位模式和movsxd r32, r/m32被列为两种模式的“有效”! 这一定是一个错误,因为它显然是错误的。 兼容/传统模式下的操作码63ARPL (它被列为 NE (64) / Valid (32),其操作部分提到 movsxd 用于 64 位模式。)因此 NE 将匹配他们将其用于具有其他含义但没有故障的事物的模式。

(NASM 和 YASM 等现实世界的汇编程序即使在 64 位模式下也拒绝movsxd eax, ecx ;他们想要一个 64 位目标,拒绝让您将其用作更糟糕的mov eax, ecx即使这在机器代码中可能的,但英特尔的手册不鼓励这样做。不幸的是, movsxd需要一个 REX 前缀来实现其唯一目的:将 32 符号扩展为 64。不是堆栈或分支操作我猜 AMD 决定将操作数大小默认为 64 更加一致-少量。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM