Как определить тип архитектуры ЦП во время выполнения с помощью GCC и встроенного ассемблера?

Мне нужно найти тип архитектуры процессора. У меня нет доступа к /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;
}

person Jared Jensen    schedule 16.12.2009    source источник
comment
Если вы используете 64-битный код, значит, вы работаете на 64-битном процессоре. Легко.   -  person Anon.    schedule 17.12.2009
comment
Анон: Если вы используете 32-битный код, вы можете работать на чем-то вроде архитектуры x86-64, а не только на 32-битной.   -  person Rushyo    schedule 17.12.2009


Ответы (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;
}
person tyranid    schedule 16.12.2009
comment
вам также нужны ebx и edx clobbers для cpuid. - person Peeter Joot; 24.11.2012
comment
@HolyBlackCat и \@Peeter: "=d" — это вывод EDX. Вы не можете затереть выходной операнд, который не будет компилироваться. - person Peter Cordes; 22.06.2018
comment
Вы также можете использовать ограничения, чтобы дать ему ввод EAX, с побочным преимуществом, что он будет компилироваться с -masm=intel godbolt.org/ г/Ltsww1. Или лучше используйте существующую функцию-оболочку cpuid из cpuid.h. Как вызвать cpuid в Linux? - person Peter Cordes; 22.06.2018