执行rdtsc,传回的是一个64bit的 'CPU时间戳记计数器'的值放入EDX:EAX 暂存器,计数器是启动电脑那一段开始运作的,会受时脉影响。
所以看拿rdtsc做什么,若拿来计时、延时的话,不同CPU或跨平台,当然会得出不同的值。要避免这情况,可用Windows API 函数 GetTickCount。
若只拿rdtsc取乱数则无需理会时脉,优点是速度快、精度高 (GetTickCount则相反,速度较慢,精度差些)。但要注意若连续取乱数(比如一次取1000个),则要加些延迟或乱数回圈,否则一堆乱数会限制在某个范围内。
另外,暂存器 CR4 中的时间戳禁用 (Time Stamp Disable, bit2) 标志对 RDTSC的使用有以下限制:
当TSD=0,RDTSC可以在任何特权等级执行;若TSD=1,RDTSC只能在特权等级 0 执行。一般情况下TSD=0,也就是说,预设情况(程式不对CR4修改)下不会禁用 RDTSC 。
所以看拿rdtsc做什么,若拿来计时、延时的话,不同CPU或跨平台,当然会得出不同的值。要避免这情况,可用Windows API 函数 GetTickCount。
若只拿rdtsc取乱数则无需理会时脉,优点是速度快、精度高 (GetTickCount则相反,速度较慢,精度差些)。但要注意若连续取乱数(比如一次取1000个),则要加些延迟或乱数回圈,否则一堆乱数会限制在某个范围内。
另外,暂存器 CR4 中的时间戳禁用 (Time Stamp Disable, bit2) 标志对 RDTSC的使用有以下限制:
当TSD=0,RDTSC可以在任何特权等级执行;若TSD=1,RDTSC只能在特权等级 0 执行。一般情况下TSD=0,也就是说,预设情况(程式不对CR4修改)下不会禁用 RDTSC 。
