使用CPUID指令可以获取CPU的的信息,执行CPUID指令的方式为
MOV EAX, 1
CPUID
EAX中的值是CPUID指令的参数,EAX中的值不同,取得的值也不同,执行完CPUID指令之后,取得的信息存放在EAX,EBX,ECX,EDX等寄存器中,
比如执行,
MOV EAX, 0
CPUID
将会把CPU的厂商信息存放在EBX,ECX,EDX中
执行
MOV EAX, 1
CPUID
将会把CPU的Signature,Feature Flag等信息放到EAX,EBX,ECX,EDX中
详情可参见Intel的文档 https://files.cnblogs.com/nielsliu/Inte_CPUID.pdf
在GNU C中嵌入汇编语言可获得CPU的信息代码如下:
#include<stdio.h>
int is_vmx_supported()
{
int result;
__asm__(
"movl $1, %%eax\n\t"
"cpuid\n\t"
"movl %%ecx,%0\n\t":"=r"(result)
);
printf("result=0x%08X", result);
return result & 0x00000020;
}
汇编代码说明:
1. gcc中的汇编代码是AT&T的风格,跟Intel风格有些差别
比如,
MOV EAX, 1 应写成 MOVL $1, %EAX
方向不同,立即数加$,寄存器加%
2. 怎样在汇编中使用C语言的变量?
使用 %0,%1 这样的占位符,然后在后面用 :"=r"(var0):"=r"(var1) 这样的形式
写完之后, 使用gcc编译
gcc -o p1 p1.c
如果想编译成汇编看一下整到一起后的汇编代码是什么样子,加个 -S参数即可
gcc -S p1.c
这样会生成一个 p1.s的汇编语言文件
浙公网安备 33010602011771号