如何将此汇编时间戳函数转换为C ++?

时间:2015-09-18 15:24:22

标签: c++ inline-assembly rdtsc

我正在尝试将其他人的项目从32位转换为64位。除了一个函数外,一切似乎都没问题,它使用在构建x64时Visual Studio不支持的汇编表达式:

// Returns the Read Time Stamp Counter of the CPU
// The instruction returns in registers EDX:EAX the count of ticks from processor reset.
// Added in Pentium. Opcode: 0F 31.
int64_t CDiffieHellman::GetRTSC( void )
{
    int tmp1 = 0;
    int tmp2 = 0;

#if defined(WIN32)
    __asm
    {
        RDTSC;          // Clock cycles since CPU started
        mov tmp1, eax;
        mov tmp2, edx;
    }
#else
    asm( "RDTSC;\n\t"
        "movl %%eax, %0;\n\t"
        "movl %%edx, %1;" 
        :"=r"(tmp1),"=r"(tmp2)
        :
        :
        );
#endif

    return ((int64_t)tmp1 * (int64_t)tmp2);
}

最有趣的是,这被用于生成随机数。在{x}下,asm块都无法编译,因此使用ifdef无法提供帮助。我只需要找到C / C ++替换来避免重写整个程序。

1 个答案:

答案 0 :(得分:7)

对于Windows分支,

sysLogErrorId

并调用setNotifyUrl内在函数。

文档on MSDN

对于Linux分支,内在函数可以使用相同的名称,但是您需要一个不同的头文件:

#include <intrin.h>