cpuid function

先貼上自己糊弄的代碼(32位系統下編譯):用來在32位系統中讀取CPUID指令的各種信息。

cpuid的詳細信息請參考64-ia-32-architectures-software-developer-manual-325462,從689頁開始

32位下嵌入彙編可以使用_asm{…}格式(彙編語句後面不用加分號)

**************************************************************************************************************************************************

#include<stdio.h>

// 嵌入彙編摘自http://www.cnblogs.com/zyl910/archive/2012/05/21/vcgetcpuid.html

void __cpuidex( int *CPUInfo, int InfoType, int ECXValue ) // 在32位下模擬__cpuidex函數, 64位VS不支持嵌套匯編
   {
        if( NULL == CPUInfo )  return;


        _asm{
            mov edi, CPUInfo    //將數組地址保存在寄存器edi
            mov eax, InfoType   //輸入功能號
            mov ecx, ECXValue  //輸入子功能號

            cpuid                         //執行cpuid指令

            mov [edi], eax          //返回寄存器的值
            mov [edi+4], ebx
            mov [edi+8], ecx
            mov [edi+12], edx
        }
   }

int main(void) {

    int dwBuf[4] = {0}; // EAX  EBX  ECX  EDX output

    int eax_value; // EAX input/output
    int ecx_value; // ECX input/output
 

    unsigned int flag = 1; // loop control
    unsigned int count; // The count of array
    unsigned int checkSpecial[] = { 0x0D, 0x0F, 0x10, 0x14 }; // special value of EAX

    while (flag){


        printf("\nPlease enter a value as EAX input: ");
        scanf_s("%X", &eax_value);  // assign eax_value
  
        if (((eax_value >= 0x00) && (eax_value <= 0x16)) || ((eax_value >= 0x80000000) && (eax_value <= 0x80000008))) { // Limit of eax_value      


            for (count = 0; count < 4; count++){


                if (eax_value == checkSpecial[count]){ // check special value


                    printf("Please enter a value as ECX input: ");
                    scanf_s("%X", &ecx_value);     //assign ecx_value
                }
            }   


            __cpuidex( dwBuf, eax_value, ecx_value);
   
           printf("EAX: %8X", dwBuf[0]);
           printf("\nEBX: %8X", dwBuf[1]);
           printf("\nECX: %8X", dwBuf[2]);
           printf("\nEDX: %8X", dwBuf[3]);
       }
       else
           printf("\nInput EAX value invalid !!! \n");

           if(eax_value == -1){

                 flag = 0;

           }
   }
   return 0;
}

***********************************************************************************************************************************************************************************************

在64位系統下可以直接調用庫函數__cpuidex    參考(https://msdn.microsoft.com/en-us/library/hskdteyh.aspx),

void __cpuidex(
   int cpuInfo[4],
   int function_id,
   int subfunction_id
);
請注意:第一參數int cpuInfo[4] 是指針!是指針!是指針!用於接收eax, ebx, ecx, edx的返回值

function_id即eax的輸入值, subfunction_id即ecx的輸入值

這個庫函數放在頭文件intrin.h裏邊


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章