GCC Windows __asm RDTSC clobber

时间:2014-04-24 16:28:27

标签: c++ c gcc assembly windows-xp

所以我尝试在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。

有什么想法吗?

提前致谢!

1 个答案:

答案 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;
}