在32位模式下,英特尔通过反转寄存器扩展的高位来解决VEX前缀与LDS/LES冲突,因为ModRM字节的mod字段不能为11b



但是,在EVEX中,R和X位没有被反转,这导致mod = 00b,这也表明BOUND指令中的内存操作数



那么他们如何才能清晰地解码该指令重叠呢?

我查看了英特尔手册,他们似乎只提到VEX中的位反转,而没有提到EVEX。

sandpile中的表中,OTOH表示EVEX中的RXB位也应反转。

其中哪一个是正确的?

最佳答案

带反转位的技巧之所以起作用,是因为有两个事实:

  • 在32位模式下,32个ZMM寄存器中只有8个可用,因此EVEX.R'位从不会翻转,因此也不会使用允许的BOUND编码进行别名。
  • 在64位模式下,没有识别出BOUND指令,因此EVEX位可以为任何值。

  • AVX上patent的摘录阐明了这一点:



    但是,Intel SDM在这一事实上尚不清楚。
    我仔细研究了SDM,实际上,在EVEX部分中没有提到EVEX编码的补码含义的痕迹。必须从EVEX是VEX的扩展这一事实中以某种方式推论得出,对于EVEX,它有一个相反含义的陈述(第2A卷,第2.3.5节,第一个项目符号):

    10-04 14:36