我被intel x64手册第902页的MASKMOVDQU指令所困。我不太确定如何在此指令中的不同寄存器大小之间进行更改。它将默认存储位置列为DS:DI / EDI / RDI,但在其操作码中也有0x66。我是否删除了0x66并将0x67 / REX.W用于EDI / RDI?
此指令的VEX版本也是这样列出的:
VEX.128.66.0F.WIG F7 /r
如何在16/32/64位大小之间切换VEX指令?
答案 0 :(得分:1)
66
位于指令中,以区别于MMX版本MASKMOVQ
。 66
不会取消67
,只需在开头添加即可。请注意,VEX编码版本甚至没有66 0F
,因为这些前缀嵌入在VEX本身中,请参阅 2.3.1指令格式部分:
消除转义操作码字节(0FH),SIMD前缀字节(66H,F2H, F3H)通过VEX前缀内的紧凑位字段表示。
此外, 2.3.5 VEX前缀:
部分SIMD前缀的压缩:传统的SSE指令有效使用 SIMD前缀(66H,F2H,F3H)作为操作码扩展字段。 VEX前缀 编码允许这种传统SSE的功能 指令(在XMM寄存器上操作,位255:128) 使用VEX.pp字段编码的相应YMM未修改的 没有任何SIMD前缀。 VEX编码的128位 指令将使目标寄存器的位255:128清零。 VEX编码的指令可以具有128位向量长度或256位 长度。
双字节和三字节操作码的压缩:最近推出的 传统SSE指令采用两个和三个字节的操作码。一个或 两个前导字节是:0FH和0FH 3AH / 0FH 38H。单字节转义 (0FH)和双字节转义(0FH 3AH,0FH 38H)也可以被解释 作为操作码扩展字段。 VEX.mmmmm字段提供压缩 允许在没有常量的情况下编码许多遗留指令 字节序列,0FH,0FH 3AH,0FH 38H。这些VEX编码指令 可能有128位向量长度或256位长度。