Assembly 如何在程序集文件中使用时重置rdtsc。我需要读取时钟周期前后的数据

Assembly 如何在程序集文件中使用时重置rdtsc。我需要读取时钟周期前后的数据,assembly,rdtsc,Assembly,Rdtsc,rdtsc在程序集文件中使用时是否停止?有没有挂着旗子的?我如何重置它?我已将第一个时钟戳读入rdx寄存器。但是,当我在等待几秒钟后再次尝试打印时钟周期时,它仍然是相同的数字。正如Hans所提示的,rdtsc将当前周期计数器作为32位寄存器对edx:eax中的64位值返回,其中edx中的最重要部分 据我所知,只有重新启动计算机才能重置此计数器。它从不停止。使用EAX代替。小心:CPU每个CPU核心有一个TSC寄存器,它们可能包含不同的值。您使用RDTSC的准确程度如何?为什么只读取EDX时间戳的

rdtsc在程序集文件中使用时是否停止?有没有挂着旗子的?我如何重置它?我已将第一个时钟戳读入rdx寄存器。但是,当我在等待几秒钟后再次尝试打印时钟周期时,它仍然是相同的数字。

正如Hans所提示的,rdtsc将当前周期计数器作为32位寄存器对edx:eax中的64位值返回,其中edx中的最重要部分


据我所知,只有重新启动计算机才能重置此计数器。

它从不停止。使用EAX代替。小心:CPU每个CPU核心有一个TSC寄存器,它们可能包含不同的值。您使用RDTSC的准确程度如何?为什么只读取EDX时间戳的高32位?假设时钟为GHz量级,EDX只会每隔几秒钟改变一次。您需要同时读取EDX和EAX的低位32位,并将它们合并为64位值。每个磁芯都有自己的RDTSC计数器;你必须确保你的应用程序不会跳转到另一个核心。如果这是内核模式代码,且WRMSR指令以MSR 0x10 IA32_TIME_STAMP_计数器为目标,则可以重置RDTSC返回的值,但不应重置,因为许多事情可能依赖于它严格递增。如果您对我上面的评论感兴趣,请参阅《英特尔软件开发人员手册》第3卷第17章,第17.13.3节时间戳计数器调整状态软件可通过使用WRMSR指令写入IA32_Time_Stamp_计数器MSR地址10H来修改逻辑处理器的时间戳计数器TSC的值。因为这样的写入只适用于该逻辑处理器,[每个核心必须写入到自己的TSC以进行同步]。对于软件来说,要做到这一点可能很难确保所有[核心]在给定的时间点具有相同的TSC值。