| 
 
| ← | 2025年10月 | → |  
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |  
|  |  |  | 1 | 2 | 3 | 4 |  
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |  
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |  
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |  
| 26 | 27 | 28 | 29 | 30 |  |  | 
 
 
 
 
 
 
 
 | 
 
 
 
 | インテルアーキテクチャのCPUには、 「そのCPUがどのような機能を持っているか?」
 を調べるための命令がPentium時代(i486から?)から搭載されている。
 
 これを使えば、
 たとえば、MMXを搭載しているか?とか、SSEが搭載されているか?等の判別が可能だ。
 
 で、ここでは、簡単にCPUID命令でCPUの名前を取得する方法を見てみよう。
 なお、C言語(VS2008)のインラインアセンブラでのコードね。
 ※VS2008のウィザードでコンソールアプリとして開発。include等は省略してありいます。
 
 
 int _tmain(int argc, _TCHAR* argv[]) {char pRet[4 * 12] ={0};
 pRet[4 * 12 - 1] = -1; //成功すればこの領域が\0になるので、判断用に-1を入れておく。
 __asm {
 //レジスタ退避
 pusha
 //CPUID命令が機能番号80000004番使えるかの確認
 mov eax, 80000000h
 cpuid
 cmp eax, 80000004h
 jl fin //使えない
 //では使おう。ホントはループした方が良いかと。
 mov eax, 80000002h
 cpuid
 //結果がeax〜edxレジスタに戻る。以下同じ。
 mov dword ptr[pRet + 4 *  0], eax
 mov dword ptr[pRet + 4 *  1], ebx
 mov dword ptr[pRet + 4 *  2], ecx
 mov dword ptr[pRet + 4 *  3], edx
 mov eax, 80000003h
 cpuid
 mov dword ptr[pRet + 4 *  4], eax
 mov dword ptr[pRet + 4 *  5], ebx
 mov dword ptr[pRet + 4 *  6], ecx
 mov dword ptr[pRet + 4 *  7], edx
 mov eax, 80000004h
 cpuid
 mov dword ptr[pRet + 4 *  8], eax
 mov dword ptr[pRet + 4 *  9], ebx
 mov dword ptr[pRet + 4 * 10], ecx
 mov dword ptr[pRet + 4 * 11], edx
 fin:
 // 退避したレジスタを戻す
 popa
 }
 if (pRet[4 * 12 - 1] == '\0') {
 //成功していれば、最後に'\0'が入っているので結果を表示
 printf("|%s|\n", pRet);
 } else {
 //失敗した
 printf("The cpuid command is not exists.\n");
 }
 return 0;
 }
 実行するとこうなります:
 
  
 まぁ、あまり使う機会はないけど、
 CPUIDを使えば、CPUのいろんな情報を引き出せるので、
 知ってて損はないかも知れない。
 
 なんで、いきなりこんな事を書いたかというと、
 部屋掃除をしていたら、昔、アセンブラでプログラムを書いていたときに読んだ、
 インテル公式のCPUの解説書が出てきたので、なんとなく。
 ※PDF提供されていたのを、プリンタ出力して製本して使ってた。
 
 
 
 | 
 00:00, Monday, May 23, 2011 ¦ 固定リンク
 ¦ 携帯 
 
 ■コメント■コメントを書く※コメントの受け付けは終了しました
 
 | 
 
 
 
 
 
 
 
 
 
 
 
 
 ![Validate my RSS feed [Valid RSS]](/blog/valid-rss.png)  |