在32位模式下,由于ModRM字节的mod字段不能为11B,Intel通过反转寄存器扩展的高位来解决VEX前缀与LDS/LES之间的冲突
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,这也指示绑定
指令中的内存操作数
REX前缀的四位R、X、B和W。W将操作数大小扩展到64位或用作额外的操作码,R扩展reg,B扩展R/m或reg,X和B扩展SIB字节中的索引和基。与VEX前缀相比,RXB是以非反转形式提供的,就像REX前缀一样。
https://en.wikipedia.org/wiki/evex_前缀
那么他们怎样才能清晰地解码指令重叠呢?
反转位的技巧之所以有效,是因为两个事实:
AVX专利的一段摘录澄清了这一点:
然而,英特尔SDM不清楚这一事实。我已经浏览了SDM,事实上,在EVEX部分没有提到EVEX编码的补充意义的痕迹。我们必须从EVEX是VEX的扩展这一事实来推断它,对于VEX有一个倒置意义的陈述(第2a卷,第2.3.5节,第一个子弹头):
该字段使用1的补码形式(倒置形式)进行编码,即XMM0/YMM0/R0编码为1111b,XMM15/YMM15/R15编码为0000b。
我正在分析Agner Fog的《优化汇编语言中的子例程:x86平台的优化指南》。尤其是我正在努力理解第12.7章。还有一个问题我无法理解。作者写道: PM处理器中的指令解码遵循4-1-1模式。示例12.6b中循环中每条指令的(融合)μops模式为2-2-2-2-2-1-1-1。这不是最优的,解码需要6个时钟周期。这超过了失效时间,因此我们可以得出结论,在示例12.6b中,指令解码是瓶颈。总执行时间
2、位检测指令(Bit Test Instruction) 指令的格式:BT/BTC/BTR/BTS Reg/Mem, Reg/Imm;80386+ 受影响的标志位:CF 位检测指令是把第一个操作数中某一位的值传送给标志位CF,具体的哪一位由指令的第二操作数来确定。 根据指令中对具体位的处理不同,又分一下几种指令: BT:把指定的位传送给CF; BTC:把指定的位传送给CF后,还使该位变反; BT
5.2.6 位操作指令 1、位扫描指令(Bit ScanInstruction) 指令的格式:BSF/BSR Reg, Reg/Mem ;80386+ 受影响的标志位:ZF 位扫描指令是在第二个操作数中找第一个“1”的位置。如果找到,则该“1”的位置保存在第一操作数中,并置标志位ZF为1,否则,置标志位ZF为0。 根据位扫描的方向不同,指令分二种:正向扫描指令和逆向扫描指令。 、正向扫描指令BSF
5.2.5 移位操作指令 移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等五大类。 移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。在8086中,该立即数只能为1,但在其后的CPU中,该立即数可以是1··31之内的数。 1、算术移位指令 算术移位指令有:算术左移SAL(ShiftAlgebraic Left)和算术右移SA
我不知道为什么,为什么我不能使用完整的64位空间例如操作数?和Sign有关吗?或者为什么会有这个限制?(那么,C是否使用前缀对int进行操作(正如前面提到的,前缀只适用于特定指令,而不适用于整个段,它应该是(大小,地址或操作数)默认值,并包含在段描述符中)。 我理解正确吗?
5.2.2 标志位操作指令 标志位操作指令是一组对标志位置位、复位、保存和恢复等操作的指令。 1、进位CF操作指令 、清进位指令CLC(ClearCarry Flag):CF←0 、置进位指令STC(Set CarryFlag):CF←1 、进位取反指令CMC(ComplementCarry Flag):CF←not CF 2、方向位DF操作指令 、清方向位指令CLD(Clear Directio