x86 ассемблер cpuid функция вывода анализирует результат регистров

Я делаю программу fasm с cpuid и получаю:

EAX -> 0x00000662
EBX -> 0x00000000
ECX -> 0x00000000
EDX -> 0x0383FBFF

Я использую fprint из /lib/ld-linux.so.2, чтобы показать этот результат.

Поэтому мне нужно прочитать все флаги из _5 _, ... regs с какой-либо функцией, чтобы увидеть все спецификации.

Это означает чтение битов из регистров или создание одной структуры вывода cpuid.

Можете ли вы дать мне одно решение?


person Cătălin George Feștilă    schedule 15.01.2013    source источник
comment
да просто перейти от регистра к переменным. gcc.gnu. org / onlinedocs / gcc / (я предполагаю, что вы используете gcc)   -  person thang    schedule 15.01.2013
comment
Нет, я использую ассемблерный код fasm. Я делаю исполняемый файл формата ELF с помощью use32 Я использую с _start: mov eax, 0x01 cpuid ... Я использую fprint только для того, чтобы показать regs. Мне нужно решение fasm для анализа вывода. Может для вас это странно, но мне нужна обучающая сборка.   -  person Cătălin George Feștilă    schedule 17.01.2013
comment
Что ты пробовал? Это следует разбить на подзадачи, например: stackoverflow.com/questions/2114163 /   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 05.08.2015


Ответы (2)


Хотя это и не fasm, посмотрите, как его использует ядро ​​Linux (GNU asm):

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
                                unsigned int *ecx, unsigned int *edx)
{
        /* ecx is often an input as well as an output. */
        asm volatile("cpuid"
            : "=a" (*eax),
              "=b" (*ebx),
              "=c" (*ecx),
              "=d" (*edx)
            : "0" (*eax), "2" (*ecx)
            : "memory");
}


/* Some CPUID calls want 'count' to be placed in ecx */
static inline void cpuid_count(unsigned int op, int count,
                               unsigned int *eax, unsigned int *ebx,
                               unsigned int *ecx, unsigned int *edx)
{
        *eax = op;
        *ecx = count;
        __cpuid(eax, ebx, ecx, edx);
}

Наконец прочтите все регистры в структуру:

struct cpuid_regs {
        u32 eax, ebx, ecx, edx;
};

static void cpuid_smp_cpuid(void *cmd_block)
{
        struct cpuid_regs *cmd = (struct cpuid_regs *)cmd_block;

        cpuid_count(cmd->eax, cmd->ecx,
                    &cmd->eax, &cmd->ebx, &cmd->ecx, &cmd->edx);
}
person Cong Wang    schedule 15.01.2013

Из моего очень старого проекта ядра и со встроенной сборкой GCC:

#define CPUID(VALUE, EAX, EBX, ECX, EDX)                            \
  __asm__ __volatile__ ("   cpuid                   \n\t"           \
                    "       movl    %%eax, %0       \n\t"           \
                    "       movl    %%ebx, %1       \n\t"           \
                    "       movl    %%ecx, %2       \n\t"           \
                    "       movl    %%edx, %3"                      \
                    : "=m" (*EAX), "=m" (*EBX), "=m" (*ECX), "=m" (*EDX) \
                    : "a" (VALUE)                                   \
                    : "%ebx", "%ecx", "%edx"                        \
                    );

Кстати, я не уверен, что вы ищете ...

person Benoit    schedule 15.01.2013