2-byte 版本的 VEX prefix 为:C5 + VEX.[RvvvvLpp]
3-byte 版本的 VEX prefix 为:C4 + VEX.[RXBmmmmm] + VEX.[WvvvvLpp]
3-byte 的 XOP prefix 为:8F + XOP.[RXBmmmmm] + XOP.[WvvvvLpp]
这些 RXB 对 ModRM.reg、ModRM.r/m 以及 SIB.index、SIB.base 提供的 registers 编码进行扩展。
VEX.RXB 与 XOP.RXB 是反相位。它颠倒 ModRM 字节和 SIB 字节提供的高 8 个与低 8 个 registers |
VEX.RXB 与 XOP.RXB 对 registers 的高半部分/低半部分反相表:
RXB |
ModRM/SIB |
registers |
1 |
000 |
rax/xmm0/ymm0 |
001 |
rcx/xmm1/ymm1 |
|
010 |
rdx/xmm2/ymm2 |
|
011 |
rbx/xmm3/ymm3 |
|
100 |
rsp/xmm4/ymm4 |
|
101 |
rbp/xmm5/ymm5 |
|
110 |
rsi/xmm6/ymm6 |
|
111 |
rdi/xmm7/ymm7 |
|
0 |
000 |
r8/xmm8/ymm8 |
001 |
r9/xmm9/ymm9 |
|
010 |
r10/xmm10/ymm10 |
|
011 |
r11/xmm11/ymm11 |
|
100 |
r12/xmm12/ymm12 |
|
101 |
r13/xmm13/ymm13 |
|
110 |
r14/xmm14/ymm14 |
|
111 |
r15/xmm15/ymm15 |
可以看出,对于 ModRM 与 SIB 字节提供的 registers 编码不变,只是 RXB 标志颠倒高半部分与低半部分。
相对于 VEX.RXB 与 XOP.RXB 的反相高低半部分来说,VEX.vvvv 与 XOP.vvvv 则是提供完全相反的 registers 编码。
如下表所示:
模式 |
VEX.vvvv/XOP.vvvv |
registers |
|
64-bit (full) |
legacy/compatibility |
1111 |
xmm0/ymm0 |
1110 |
xmm1/ymm1 |
||
1101 |
xmm2/ymm2 |
||
1100 |
xmm3/ymm3 |
||
1011 |
xmm4/ymm4 |
||
1010 |
xmm5/ymm5 |
||
1001 |
xmm6/ymm6 |
||
1000 |
xmm7/ymm7 |
||
64-bit (only ) |
0111 |
xmm8/ymm8 |
|
0110 |
xmm9/ymm9 |
||
0101 |
xmm10/ymm10 |
||
0100 |
xmm11/ymm11 |
||
0011 |
xmm12/ymm12 |
||
0010 |
xmm13/ymm13 |
||
0001 |
xmm14/ymm14 |
||
0000 |
xmm15/ymm15 |
对于 imm8[7:4] 提供的 registers 寻址来说,它并不提供反相作用。
如下表:
imm8[7:4] |
registers |
0000 |
rax/xmm0/ymm0 |
0001 |
rcx/xmm1/ymm1 |
0010 |
rdx/xmm2/ymm2 |
0011 |
rbx/xmm3/ymm3 |
0100 |
rsp/xmm4/ymm4 |
0101 |
rbp/xmm5/ymm5 |
0110 |
rsi/xmm6/ymm6 |
0111 |
rdi/xmm7/ymm7 |
1000 |
r8/xmm8/ymm8 |
1001 |
r9/xmm9/ymm9 |
1010 |
r10/xmm10/ymm10 |
1011 |
r11/xmm11/ymm11 |
1100 |
r12/xmm12/ymm12 |
1101 |
r13/xmm13/ymm13 |
1110 |
r14/xmm14/ymm14 |
1111 |
r15/xmm15/ymm15 |