您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?

Posted

技术标签:

【中文标题】您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?【英文标题】:How do you detect the CPU architecture type during run-time with GCC and inline asm? 【发布时间】:2009-12-16 21:09:47 【问题描述】:

我需要找到 CPU 的架构类型。我无权访问 /proc/cpuinfo,因为机器正在运行 syslinux。我知道有一种使用内联 ASM 的方法,但是我认为我的语法不正确,因为我的变量 iedx 没有正确设置。

我和 ASM 一起吃苦头,绝不是专家。如果有人有任何提示或可以为我指出正确的方向,我将非常感激。

static int is64Bit(void) 
    int iedx = 0;
    asm("mov %eax, 0x80000001");
    asm("cpuid");
    asm("mov %0, %%eax" : : "a" (iedx));
    if ((iedx) && (1 << 29))
    
        return 1;
    
    return 0;

【问题讨论】:

如果您运行的是 64 位代码,那么您运行的是 64 位处理器。容易。 匿名:如果您运行的是 32 位代码,那么您可能运行在诸如 x86-64 架构之类的架构上,而不仅仅是 32 位架构。 【参考方案1】:

这么几行你能装多少错误 ;)

试试

static int is64bit(void) 
        int iedx = 0;
        asm volatile ("movl $0x80000001, %%eax\n"
                "cpuid\n"
        : "=d"(iedx)
        : /* No Inputs */
        : "eax", "ebx", "ecx"
        );

        if(iedx & (1 << 29))
        
                return 1;
        
        return 0;

【讨论】:

cpuid 也需要 ebx 和 edx clobbers。 @HolyBlackCat 和 \@Peeter:"=d" 是 EDX 输出。您不能破坏无法编译的输出操作数。 您还可以使用约束为其提供 EAX 输入,附带的好处是它将与 -masm=intel godbolt.org/g/Ltsww1 一起编译。或者更好的是,使用来自cpuid.h 的现有cpuid 包装函数。 How do I call "cpuid" in Linux?

以上是关于您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?的主要内容,如果未能解决你的问题,请参考以下文章

gcc 内联 asm x86 CPU 标志作为输入依赖项

ARM嵌入式开发中的GCC内联汇编__asm__

GCC 内联汇编错误:变量 '%al' 的 asm 说明符与 asm clobber 列表冲突

GCC 使用 asm 块错误地内联函数

并发使用中内联 asm 的设计元素

GCC 内联汇编的副作用