RDTSC - 读取时间标签计数器
操作码 | 指令 | 说明 |
0F 31 | RDTSC | 将时间标签计数器读入 EDX:EAX |
说明
将处理器的时间标签计数器的当前值加载到 EDX:EAX 寄存器。时间标签计数器包含在 64 位 MSR 中。MSR 的高 32 位加载到 EDX 寄存器,低 32 位加载到 EAX 寄存器。处理器每时钟周期递增时间标签计数器 MSR 一次,在处理器复位时将它重设为 0。
寄存器 CR4 中的时间标签禁用 (TSD) 标志限制 RDTSC 的使用。清除 TSD 标志时,RDTSC 指令可以在任何特权级别执行;设置此标志时,指令只能在特权级别 0 执行。在特权级别 0 执行时,时间标签计数器还可以使用 RDMSR 指令读取。
RDTSC 指令不是序列化指令。这样,在读取计数器之前,它没有必要等到前面的所有指令都已执行。类似地,在执行读取操作之前,后面的指令也可以开始执行。
此指令在“英特尔(R) 体系结构”的奔腾(R) 处理器中引入。
操作
IF (CR4.TSD TimeStampCounter;
ELSE (* CR4 is 1 and CPL is 1, 2, or 3 *)
#GP(0)
FI;
影响的标志
无。
保护模式异常
#GP(0) - 如果寄存器 CR4 中的 TSD 标志设置为 1,并且 CPL 大于 0。
实地址模式异常
#GP - 如果寄存器 CR4 中的 TSD 标志设置为 1。
虚 8086 模式异常
#GP(0) - 如果寄存器 CR4 中的 TSD 标志设置为 1。
==============================================================
如果系统的RDTSC被禁用,那么可以用下面的命令代替:
__asm _emit 0x0F
__asm _emit 0x31
-------------------------------------------------------我是分割线---------------------------------------------------
ptr -- pointer (既指针)得缩写。
汇编里面 ptr 是规定 的 字 (既保留字),是用来临时指定类型的。
(可以理解为,ptr是临时的类型转换,相当于C语言中的强制类型转换)
如 mov ax,bx ; 是把BX寄存器“里”的值赋予AX,由于二者都是寄存器,长度已定(word型),所以没有必要加“WORD”
mov ax,word ptr [bx]; 是把内存地址等于“BX寄存器的值”的地方所存放的数据,赋予ax。由于只是给出一个内存地址,不知道希望赋予ax的,是byte还是word,所以可以用word明确指出;如果不用,既(mov ax, [bx]; )则在8086中是默认传递一个字,既两个字节给ax。
总结,既有寄存器时可以,且一般不用ptr;没有时一定要用(防止当两个操作数的宽度不一样)。
--------------------------------------------------------我是分割线--------------------------------------------------
__inline void __cputicks_msc(UINT64 *val)
{
__int64 t;
__asm
{
rdtsc;
mov dword PTR [t],eax;
mov dword PTR [t+4],edx;
}
*val = (UINT64)t;
}