【问题标题】:GCC Windows __asm RDTSC clobber [duplicate]GCC Windows __asm RDTSC clobber [重复]
【发布时间】:2014-06-10 01:50:46
【问题描述】:

所以我正在尝试在 GCC 中为 windows 编译一些 C。长话短说,我无法让 Visual Studios 编译适用于 XP 的 EXE。所以我想我可以试试 GCC。

它正在努力的代码是:

__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”。所以我认为它不区分大小写。

最终结果需要是在 WinXP/7/8/8.1 x86/x64 上运行的 EXE。

有什么想法吗?

提前致谢!

【问题讨论】:

  • 你用的是什么版本的gcc?
  • 4.8.1 我确实这么认为。如果是由于这个原因,我如何在 Windows 中获取新版本?因为 GCC 确实生成了一个可以在 XP 中运行的 EXE
  • 或者我将如何在 Linux for Windows 中编译它。因为我理解通过拆分产生错误的行会产生 x86 和 x64 操作系统的 RDTSC。所以我有点需要那个:)
  • 你用什么类型的lower和upper?

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


【解决方案1】:

在 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 Studio、x86 和 x64 上都可以工作:

#include <stdio.h>
#include <intrin.h>    

int main ( void )
{
    unsigned _int64 ull = 0;

    ull = __rdtsc();    // "Intrinsics"

    printf("%I64u\n",ull);
    return 0;
}

【讨论】:

  • 我将变量“lower”和“upper”设置为 unsigned long long。这是您的解决方案和我的解决方案之间的唯一区别吗?我勒个去?谢谢你。但现在我担心我的结果会有所不同?
  • 我编辑了代码,但在 Win64 上无法查看
  • 它可以找到。我得到了正确的结果:) 谢谢
  • 最后一个 sn-p 应该在 Visual Studio 上使用 #include &lt;intrin.h&gt;
  • @Ben Voigt:完成。对不起。我想知道为什么我的编译器没有抱怨。
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2012-11-15
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多