我使用cpuid
创建一个fasm程序,输出为:
EAX -> 0x00000662
EBX -> 0x00000000
ECX -> 0x00000000
EDX -> 0x0383FBFF
我使用fprint
中的/lib/ld-linux.so.2
来显示此输出。
所以我需要阅读来自EAX
的所有标志,... regs以及一些功能来查看所有规格。
这意味着从寄存器中读取位或创建cpuid
输出的一个结构。
你能给我一个解决办法吗?
答案 0 :(得分:1)
虽然不是很好,但请看一下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);
}
答案 1 :(得分:0)
从我很老的kernel project,以及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" \
);
顺便说一下,我不确定你在找什么...