步行者

--勿在浮沙筑高台
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

GNU C嵌入汇编,读取CPU功能标志

Posted on 2010-08-27 10:32  Niels  阅读(547)  评论(0)    收藏  举报

使用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的汇编语言文件