如何获知当前系统是否支持CPUID指令

本文介绍了一种检测当前系统是否支持CPUID指令的方法。通过检查EFLAGS寄存器的第21位,可以判断系统是否能使用CPUID指令,进而获取CPU的相关规格信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rel="File-List" href="file:///C:/DOCUME%7E1/MICROS%7E1/LOCALS%7E1/Temp/msoclip1/03/clip_filelist.xml">

如何获知当前系统是否支持CPUID指令

CPUID指令是一个非常有用的指令,通过它能够获知相关CPU的具体规格,比如是否支持MMX/SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2指令,I/Dcache的大小,厂商等信息。因为一些老的CPU不支持它,为了程序有更好的兼容性,所以在使用之前最好要检查一下当前系统是否支持它。

那么如何检测呢?

很简单,EFLAGS寄存器的第21位用于指示是否CPUID能够被使用。如果软件能够对它进行设置或者清除,那么当前系统是可利用的。为了给大家清楚的说明这点,我这里给出了一个例子(因为水平有限,请大家将就一些啦J)。

int CPUID_IsSupported( void )

{

       int supported = 0;

 

       __asm

       {

              pushfd

              pop eax

              mov ebx, eax

              xor eax, 200000h

              push eax

              popfd

 

              pushfd

              pop eax

              push ebx

              popfd

              xor ecx, ecx

              mov edx, 1

              xor eax, ebx

              cmovz edx, ecx

              mov supported, edx

       }

 

       return supported;

}

 

EFLAGS寄存器我们不能够直接访问,所以通过PUSHFD/POPFD来完成相应的修改动作。程序的基本思路是先将EFLAGS存放在EAX/EBX中,在修改它的第21位后通过POPFD来完成更新工作。在此之后,通过再次获取它的当前值(存放在EAX中)与修改前之值(存放在EBX中)进行比较,若发现一致,则表面当前系统不支持CPUID指令,反之亦然。

 

小结

1. 程序中的push ebxpopfd这两条指令不是必须的。因为我喜欢干净,所以在这里添加了它们,主要目的是保持它的原有状态。如果喜欢效率的网友感觉不爽,完全可以剔除。

2. 没有对它进行什么优化,程序可能存在邋遢部分。如果哪位网友能够帮助优化,我将深表谢意。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值