- 此问题在此处已有答案**:
How to get the CPU cycle count in x86_64 from C++?(5个答案)
2天前关闭。
我正在想办法用C++读这个汇编代码。
这是密码:
unsigned __int64 high_perf_time;
unsigned __int64 *dest = &high_perf_time;
__asm
{
_emit 0xf // these two bytes form the 'rdtsc' asm instruction,
_emit 0x31 // available on Pentium I and later.
mov esi, dest
mov [esi ], eax // lower 32 bits of tsc
mov [esi+4], edx // upper 32 bits of tsc
}
__int64 time_s = (__int64)(high_perf_time / frequency); // unsigned->sign conversion should be safe here
__int64 time_fract = (__int64)(high_perf_time % frequency); // unsigned->sign conversion should be safe here
我知道0xf 0x31
是rdtsc eax, edx
,但是mov esi,dest
是什么?我怎么用C++写它呢?
2条答案
按热度按时间dojqjjoe1#
如果您想了解这三条指令的作用:
以下三个说明:
...与以下C++代码等效:
由于x86 CPU是“little-endian”,因此这等于:
...但是,由于您无法直接使用C++访问
eax
和edx
寄存器,因此此操作必须使用汇编代码完成。b09cbbtk2#
C++代码为
文档位于:https://learn.microsoft.com/en-us/cpp/intrinsics/rdtsc
但是您可能需要
QueryPerformanceCounter()
和QueryPerformanceFrequency()
,否则,如果在连续的__rdtsc()
调用之间将线程调度到不同的处理器内核上,则会出现争用情况。