【发布时间】:2018-07-28 22:11:57
【问题描述】:
在 32 位模式下,Intel 通过反转寄存器扩展的高位来解决 VEX 前缀与 LDS/LES 冲突,因为 ModRM 字节的 mod 字段不能为 11b
VEX 前缀的初始字节值 C4h 和 C5h 与 LDS 和 LES 指令的操作码相同。 64 位模式不支持这些指令。为了解决在 32 位模式下的歧义,VEX 的规范利用了这样一个事实,即合法的 LDS 或 LES 的 ModRM 字节不能是 11xxxxxx 形式(它将指定一个寄存器操作数)。 VEX 前缀的第二个字节中的各种位域被反转,以确保该字节在 32 位模式下始终是这种形式。
https://en.wikipedia.org/wiki/VEX_prefix#Technical_description
但是在 EVEX 中,R 和 X 位没有反转,这导致 mod=00b,这也表示 BOUND 指令中的内存操作数
来自 REX 前缀的四位 R、X、B 和 W。 W 将操作数大小扩展为 64 位或用作附加操作码,R 扩展 reg,B 扩展 r/m 或 reg,X 和 B 扩展 SIB 字节中的索引和基数。 与 VEX 前缀相比,RXB 以非反转形式提供,就像在 REX 前缀中一样。
那么他们如何干净利落地解码重叠的指令呢?
我查看了英特尔手册,他们似乎只提到了 VEX 中的位反转,而不是 EVEX。
OTOH sandpile 中的表格说 EVEX 中的那些 RXB 位也应该反转。
哪一个是正确的?
【问题讨论】:
-
这很有趣,如果我用 EVEX 组装一些指令,它们会输出 RXB 反转,这当然适用于
bound。但是手册似乎没有说要这样做.. -
R & X 位不用于 32 位模式,因此可能必须将这些位设置为 1 以避免创建有效的 BOUND 指令。
-
@RossRidge 即使在 64 位模式下,它们也会被反转。至少
nasm这么认为,必须在实际的 cpu 上进行测试。
标签: assembly x86 instructions opcode