0

我制作了一个 fasm 程序,cpuid输出为:

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

我使用fprintfrom/lib/ld-linux.so.2来显示这个输出。

所以我需要从EAX,... regs 中读取所有标志,并使用一些功能来查看所有规范。

这意味着从寄存器中读取位或制作一种cpuid输出结构。

你能给我一个解决方案吗?

4

2 回答 2

1

虽然不是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);
}
于 2013-01-15T14:23:54.303 回答
0

从我非常古老的内核项目中,并使用 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"                        \
                    );

顺便说一句,我不确定你在寻找什么......

于 2013-01-15T13:19:28.227 回答