使用GCC和内联汇编在运行时如何检测CPU体系结构类型?

3
我需要找到CPU的架构类型。由于机器正在运行syslinux,我无法访问/proc/cpuinfo。我知道有一种使用内联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位处理器上运行。很容易。 - Anon.
1
如果你正在运行32位代码,那么你可能正在运行在x86-64架构上,而不仅仅是32位。 - Rushyo
1个回答

6

有多少个漏洞可以在这么少的代码行中找到呢 ;)

试试吧

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

1
你也需要使用EBX和EDX寄存器来执行CPUID。 - Peeter Joot
1
@HolyBlackCat和@Peeter:"=d"是EDX输出。你不能破坏一个输出操作数,否则编译不会通过。 - Peter Cordes
1
您还可以使用约束条件来为其提供EAX输入,这样的好处是它将与-masm=intel一起编译。https://godbolt.org/g/Ltsww1。或者更好的方法是使用`cpuid.h`中的现有`cpuid`包装函数。[如何在Linux中调用“cpuid”?](https://dev59.com/323Xa4cB1Zd3GeqPag8W) - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接