所以我尝试在GCC中为Windows编译一些C.长话短说我无法让Visual Studios编译一个适用于XP的EXE。所以我想我会试试海湾合作委员会。
它所挣扎的代码是:
__asm __volatile ("rdtsc": "=a" (lower), "=d"(upper));
我得到的错误是:
HITWxp.c:22:2: error: inconsistent operand constraints in an 'asm'
__asm __volatile ("rdtsc": "=A" (lower), "=D"(upper));
^
现在,当我将线路更改为此时,它会编译:
__volatile ("rdtsc": "=A" (lower));
我注意到它转换了" = a"从第一个例子到首都" = A"在第二个例子中。所以我认为它不区分大小写。
最终结果需要和EXE一样适用于WinXP / 7/8 / 8.1 x86 / x64。
有什么想法吗?
提前致谢!
答案 0 :(得分:0)
在MingW32和CygWin上正常工作:
#include <stdio.h>
#include <stdint.h>
int main ( void )
{
uint32_t lower = 0, upper = 0;
asm volatile ("rdtsc": "=a" (lower), "=d" (upper));
uint64_t ull = ((uint64_t) upper << 32) + lower;
printf ("%08X %08X\n", upper, lower);
printf ("%llu\n", ull);
return 0;
}
和Visual Studio 2010:
#include <stdio.h>
int main ( void )
{
unsigned _int64 ull = 0;
_asm
{
rdtsc
mov dword ptr ull, eax
mov dword ptr ull+4, edx
}
printf("%I64u\n",ull);
return 0;
}
这个应该适用于Visual Studios,x86和x64:
#include <stdio.h>
#include <intrin.h>
int main ( void )
{
unsigned _int64 ull = 0;
ull = __rdtsc(); // "Intrinsics"
printf("%I64u\n",ull);
return 0;
}