我制作了一个 fasm 程序,cpuid
输出为:
EAX -> 0x00000662
EBX -> 0x00000000
ECX -> 0x00000000
EDX -> 0x0383FBFF
我使用fprint
from/lib/ld-linux.so.2
来显示这个输出。
所以我需要从EAX
,... regs 中读取所有标志,并使用一些功能来查看所有规范。
这意味着从寄存器中读取位或制作一种cpuid
输出结构。
你能给我一个解决方案吗?
虽然不是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);
}
从我非常古老的内核项目中,并使用 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" \
);
顺便说一句,我不确定你在寻找什么......