← |
2024年11月 |
→ |
日 |
月 |
火 |
水 |
木 |
金 |
土 |
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
|
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 ¦ 固定リンク
¦ 携帯
■コメント
■コメントを書く
※コメントの受け付けは終了しました
|
|