如何将此程序集时间戳函数转换为 C++?
How can I convert this assembly timestamp function to C++?
我正在尝试将其他人的项目从 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++ 替换以避免重写整个程序。
对于 Windows 分支,
#include <intrin.h>
并调用 __rdtsc()
内部函数。
文档on MSDN
对于 Linux 分支,内部函数以相同的名称提供,但您需要不同的头文件:
#include <x86intrin.h>
我正在尝试将其他人的项目从 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++ 替换以避免重写整个程序。
对于 Windows 分支,
#include <intrin.h>
并调用 __rdtsc()
内部函数。
文档on MSDN
对于 Linux 分支,内部函数以相同的名称提供,但您需要不同的头文件:
#include <x86intrin.h>