如何獲知當前系統是否支援CPUID指令
阿新 • • 發佈:2019-02-11
如何獲知當前系統是否支援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暫存器我們不能夠直接訪問,所以通過
小結:
1. 程式中的push ebx和popfd這兩條指令不是必須的。因為我喜歡乾淨,所以在這裡添加了它們,主要目的是保持它的原有狀態。如果喜歡效率的網友感覺不爽,完全可以剔除。
2. 沒有對它進行什麼優化,程式可能存在邋遢部分。如果哪位網友能夠幫助優化,我將深表謝意。