1. 程式人生 > >如何獲知當前系統是否支援CPUID指令

如何獲知當前系統是否支援CPUID指令

如何獲知當前系統是否支援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. 沒有對它進行什麼優化,程式可能存在邋遢部分。如果哪位網友能夠幫助優化,我將深表謝意。