3

我正在尝试将别人的项目从 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);
}

最有趣的是,它被用于生成随机数。这两个asm块都不能在 x64 下编译,所以玩起来ifdef没有帮助。我只需要找到 C/C++ 替换以避免重写整个程序。

4

1 回答 1

7

对于 Windows 分支,

#include <intrin.h>

并调用__rdtsc()内在函数。

MSDN 上的文档

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

#include <x86intrin.h>
于 2015-09-18T15:28:27.617 回答