0

fasm プログラムを作成するcpuidと、出力は次のようになります。

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

fprintfromを使用し/lib/ld-linux.so.2てこの出力を表示します。

EAXしたがって、すべての仕様を表示するには、いくつかの関数を使用して ,... regsからすべてのフラグを読み取る必要があります。

これは、レジスタからビットを読み取ること、またはcpuid出力の 1 つの構造を作成することを意味します。

それを行うための1つの解決策を教えてもらえますか?

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 に答える