您当然不想连接两个值的十进制字符串表示。这不是您期望将返回的两个 32 位值组合RTDSC
成 64 位值的方式。
结合 46523 和 1236 不应产生 465231236。这是错误的答案。相反,您希望获取高 32 位,并将它们与低 32 位放在一起。
你正在结合$0000B5BB
和$00004D4
。正确答案是$0000B5BB00004D4
或$00004D40000B5BB
,这取决于这两个值中的哪一个是高阶部分和低阶部分。
在代码中实现它,例如,使用Int64Rec
:
var
Value: UInt64;
...
Int64Rec(Value).Lo := Lo;
Int64Rec(Value).Hi := Hi;
其中Lo
和Hi
是由 . 返回的低和高 32 位值RTDSC
。
因此,位 0 到 31 设置为 的值Lo
,位 32 到 63 设置为 的值Hi
。
或者可以使用按位运算编写:
Value := (UInt64(Hi) shl 32) or UInt64(Lo);
如果您需要做的只是读取时间戳计数器,那么您无需执行任何操作。您可以像这样实现该功能:
function TimeStampCounter: UInt64;
asm
RDTSC
end;
寄存器调用约定要求将 64 位值返回值传递回EDX:EAX
. 由于将RDTSC
值放在那些确切的寄存器中(顺便说一句,这不是巧合),因此您无事可做。
综上所述,通常最好使用性能计数器,而不是使用时间戳计数器,它由TStopWatch
from包装System.Diagnostics
。