在英特尔软件开发人员手册,第 2B 卷,第 4-540 页中,介绍了汇编
RDPID
指令。
Opcode/Instruction
F3 0F C7 /7
RDPID r32
Op/En
R
64/32-bit Mode
N.E./V
CPUID Feature Flag
RDPID
Description
Read IA32_TSC_AUX into r32.
Opcode/Instruction
F3 0F C7 /7
RDPID r64
Op/En
R
64/32-bit Mode
V/N.E.
CPUID Feature Flag
RDPID
Description
Read IA32_TSC_AUX into r64.
然后
Instruction Operand Encoding
Op/En
R
Operand 1
ModRM:r/m (w)
Operand 2
N/A
Operand 3
N/A
Operand 4
N/A
我不熟悉所采用的约定,并且从表格中我无法理解指令的语法。我唯一能猜测的是 32 位和 64 位模式的操作码是相同的,所以也许这两种情况下的指令是相同的。另外,该指令是只读的(也许这就是
R
中的Op/En
)。
但是剩下的呢?我试过了
rdpid <destination_register>
而且它似乎有效。还提到了
CS.D
和 REX.W
,我不知道(并且在手册中搜索 REX.W
没有用,我找不到解释)。为什么操作数 1 不是目标寄存器?什么是ModRM:r/m (w)
?
那么,真正的问题:该指令的正确语法是什么以及如何从手册中提供的信息中获取它?
CS.D
是 D
引用的段描述符中的 CS
位,指示这是 16 位还是 32/64 位代码段。 REX.W
是 W
前缀系列(REX
到 40h
)中的 4Fh
位,指示 64 位操作数大小。
指令描述为
F3 0F C7 /7 RDPID r32 (in 16/32 bit mode)
F3 0F C7 /7 RDPID r64 (in 64 bit mode)
符号
/7
的意思是“reg 字段中带有 7 的 modr/m 字节”。符号 r32
和 r64
分别表示“32 位或 64 位通用寄存器”。从“指令操作数编码”表中可以得知该操作数被编码在modr/m字节的r/m字段中。因此,在 32 位模式下,您可以使用这样的指令:
F3 0F C7 CF RDPID ECX
在 64 位模式下如下:
F3 0F C7 CF RDPID RCX