assembly 此汇编代码的C++等效项是什么[duplicate]

mw3dktmi  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(162)
    • 此问题在此处已有答案**:

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 0x31rdtsc eax, edx,但是mov esi,dest是什么?我怎么用C++写它呢?

dojqjjoe

dojqjjoe1#

如果您想了解这三条指令的作用:
以下三个说明:

mov esi, dest
    mov [esi  ], eax    // lower 32 bits of tsc
    mov [esi+4], edx    // upper 32 bits of tsc

...与以下C++代码等效:

uint32_t * esi = (uint32_t *)dest;
    esi[0] = eax;
    esi[1] = edx;

由于x86 CPU是“little-endian”,因此这等于:

*dest = (((__int64_t)edx)<<32) + (uint32_t)eax;

...但是,由于您无法直接使用C++访问eaxedx寄存器,因此此操作必须使用汇编代码完成。

b09cbbtk

b09cbbtk2#

C++代码为

#include <intrin.h>
unsigned __int64 high_perf_time = __rdtsc();

文档位于:https://learn.microsoft.com/en-us/cpp/intrinsics/rdtsc
但是您可能需要QueryPerformanceCounter()QueryPerformanceFrequency(),否则,如果在连续的__rdtsc()调用之间将线程调度到不同的处理器内核上,则会出现争用情况。

相关问题