在卷。 2A 3-5,英特尔综合手册 PDF,订单号:325462-080US,2023 年 6 月。
3.1.1.3 操作码汇总表中的指令栏
此部分的标题项为 r/m8、r/m16、r/m32 和 r/m64。例如,
r/m8 - 字节操作数,可以是字节通用寄存器(AL、CL、DL、BL、AH、CH、DH、BH、BPL、SPL、DIL 和 SIL)的内容,也可以是来自记忆。字节寄存器 R8B - R15B 可在 64 位模式下使用 REX.R。
r/m16 — 字通用寄存器或内存操作数,用于操作数大小属性为 16 位的指令。字通用寄存器有:AX、CX、DX、BX、SP、BP、SI、DI。存储器的内容可在有效地址计算提供的地址处找到。字寄存器 R8W - R15W 可在 64 位模式下使用 REX.R。
r/m32 — 双字通用寄存器或内存操作数,用于操作数大小属性为 32 位的指令。双字通用寄存器有:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。存储器的内容可在有效地址计算提供的地址处找到。在 64 位模式下使用 REX.R 时,双字寄存器 R8D - R15D 可用。
r/m64 — 使用 REX.W 时,用于操作数大小属性为 64 位的指令的四字通用寄存器或内存操作数。四字通用寄存器有:RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8–R15;这些仅在 64 位模式下可用。内存的内容是在有效地址计算提供的地址处找到的。
虽然有 r/m8、r/m16、r/m32 和 r/m64,但本节中没有 reg/m8 和 reg/m16。
但是有一个reg标题项,如下:
reg - 当寄存器的宽度与指令操作的语义无关时,用于指令的通用寄存器。寄存器可以是 r16、r32 或 r64。
因此我认为在 reg/m8 或 reg/m16 中,reg 代表 r16/r32/r64 GPR,并且在任何具有这些操作数的指令中,寄存器的宽度与语义无关指令的操作。
因此,我认为如下:
在r/m8的情况下,r代表8位GPR。
在r/m16的情况下,r代表16位GPR。
对于r/m32,r代表32位GPR。
对于r/m64,r代表64位GPR。
对于 reg/m8,reg 代表 r16/r32/r64 GPR。
对于 reg/m16,reg 代表 r16/r32/r64 GPR。
这是正确的解释吗?
顺便说一句,我认为所有具有 reg/m8 或 reg/m16 操作数的指令都是
PEXTRB reg/m8, xmm2, imm8 ; 66 0F 3A 14 /r ib
PEXTRW reg/m16, xmm, imm8 ; 66 0F 3A 15 /r ib
VMOVW xmm1, reg/m16 ; EVEX.128.66.MAP5.WIG 6E /r
VMOVW reg/m16, xmm1 ; EVEX.128.66.MAP5.WIG 7E /r
VPEXTRB reg/m8, xmm2, imm8 ; VEX.128.66.0F3A.W0 14 /r ib
VPEXTRB reg/m8, xmm2, imm8 ; EVEX.128.66.0F3A.WIG 14 /r ib
VPEXTRW reg/m16, xmm2, imm8 ; VEX.128.66.0F3A.W0 15 /r ib
VPEXTRW reg/m16, xmm2, imm8 ; EVEX.128.66.0F3A.WIG 15 /r ib
.