cpuidでCPUの名前を取得する

みんなが作った便利な関数やサンプルを共有するコミュニティです。
[url]http://www.activebasic.com/forum/viewforum.php?f=2]ActiveBasicの「実践コードモジュール」[/url]的な感じでやりましょう。
フォーラム(掲示板)ルール
・投稿するコードはできるだけ一つ、もしくは一つの関数を補助する複数の関数の形式にするか、
それだけをコンパイルして動くソースコード一式の形にしてください。
記事には説明だけを書き、コードは添付ファイルにしてもかまいません。
・使い方などの説明も書いてください。
環境に依存するコードの場合は、対象の環境も書いてください。
・使用条件(ライセンスなど)も書いていただけるとありがたいです。
・C言語、もしくはC++推奨ですが、他の言語でもかまいません。
・コードは正しくcodeタグで囲みましょう。
・一つのスレッドで一つのサンプルが基本です。
関連するサンプルの場合はまとめてもかまいません。
・投稿したサンプルを修正する場合には、スレッドの返信の形で投稿してください。
(新しいスレッドにしないでください。記事の編集でもかまいません)
返信
アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

cpuidでCPUの名前を取得する

#1

投稿記事 by みけCAT » 5年前

cpuid命令を用いて、CPUの名前を取得します。
正確には、ベンダIDとプロセッサブランドを取得します。

コード:

#include <stdio.h>

/*
http://ja.wikipedia.org/wiki/CPUID
*/

int main(void) {
	char venderID[16]={0};
	char processorBland[64]={0};
	char* pVenderID=&venderID[0];
	char* pProcessorBland=&processorBland[0];
	__asm__ volatile (
		"movl %0,%%esi\n\t"
		"movl %1,%%edi\n\t"

		"movl $0,%%eax\n\t"
		"cpuid\n\t"
		"movl %%ebx,(%%esi)\n\t"
		"movl %%edx,4(%%esi)\n\t"
		"movl %%ecx,8(%%esi)\n\t"

		"movl $0x80000000,%%eax\n\t"
		"cpuid\n\t"
		"cmp $0x80000004,%%eax\n\t"
		"jl nobland\n\t"
		"movl $0x80000002,%%eax\n\t"
		"cpuid\n\t"
		"movl %%eax,(%%edi)\n\t"
		"movl %%ebx,4(%%edi)\n\t"
		"movl %%ecx,8(%%edi)\n\t"
		"movl %%edx,12(%%edi)\n\t"
		"movl $0x80000003,%%eax\n\t"
		"cpuid\n\t"
		"movl %%eax,16(%%edi)\n\t"
		"movl %%ebx,20(%%edi)\n\t"
		"movl %%ecx,24(%%edi)\n\t"
		"movl %%edx,28(%%edi)\n\t"
		"movl $0x80000004,%%eax\n\t"
		"cpuid\n\t"
		"movl %%eax,32(%%edi)\n\t"
		"movl %%ebx,36(%%edi)\n\t"
		"movl %%ecx,40(%%edi)\n\t"
		"movl %%edx,44(%%edi)\n\t"
		"nobland:\n\t"
	: /* output register : NIL */
	: "m" (pVenderID), "m" (pProcessorBland)
	: "%eax","%ebx","%ecx","%edx");
	printf("Vender    ID    : %s\n",venderID);
	printf("Processor Bland : %s\n",processorBland);
	return 0;
}
改造・再配布・再利用・商用利用などなんでも自由。
ただし、これを利用したことによるいかなる損害についても、一切責任を負いません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“サンプルを共有するコミュニティ” へ戻る