
_START_ARTICLE_
CPUID
_START_SECTION_
CPUID命令の呼び出し
_START_PARAGRAPH_
CPUID命令は、EAXレジスタが暗黙のオペランドであり、それ以外の（明示的な）オペランドは無い。どのような情報を返すべきかを指定する値をEAXレジスタに設定し、CPUID命令を実行する。まずEAX = 0でCPUIDを呼び出し、CPUでサポートされている最大のパラメータを取得するべきである。CPUIDの拡張機能情報を取得する場合は、EAXのビット31をセットしてCPUIDを呼び出す。拡張機能情報でサポートされている最大の機能番号を得るためには、EAX = 8000000hでCPUIDを呼び出す。
_START_SECTION_
EAX=2: キャッシュとTLBディスクリプタ情報
_START_PARAGRAPH_
これは、キャッシュとTLBの機能を示すディスクリプタのリストをEAX, EBX, ECX, EDXレジスタに格納する。
_START_SECTION_
EAX=3: プロセッサ・シリアル・ナンバ
_START_PARAGRAPH_
これは、プロセッサのシリアル番号を返す。プロセッサ・シリアル・ナンバは、インテルがPentium IIIで導入したが、プライバシーの懸念のためにこの後のモデルでは実装されていない（PSN機能ビットは常にクリアされている）。トランスメタのEfficeonとCrusoeプロセッサはこの機能を提供している。AMDは、この機能をどのCPUにも実装しなかった。_NEWLINE_インテルPentium IIIでは、シリアル番号はEDX:ECXレジスタに格納される。トランスメタのEfficeonではEBX:EAXレジスタに、CrusoeではEBXレジスタだけに格納される。_NEWLINE_プロセッサ・シリアル・ナンバ機能を使用するためには、BIOSの設定を有効にする必要があることに注意すべきである。_NEWLINE_.section.datas0:.string "Processor serial number: %.4hX-%.4hX-%.4hX-%.4hX-%.4hX-%.4hX\n".text_NEWLINE_.global main_NEWLINE__NEWLINE_.typemain, @functionmain:_NEWLINE_pushq%rbp_NEWLINE_movq%rsp, %rbp_NEWLINE__NEWLINE_movl$1, %eax_NEWLINE_cpuid_NEWLINE__NEWLINE_subq$4, %rsp_NEWLINE_movl%eax, (%rsp)_NEWLINE_movq2(%rsp), %rbx_NEWLINE_movw%bx, (%rsp)_NEWLINE_movw%ax, 2(%rsp)_NEWLINE__NEWLINE_movl$3, %eax_NEWLINE_cpuid_NEWLINE__NEWLINE_movl%edx, 4(%rsp)_NEWLINE_movq6(%rsp), %rax_NEWLINE_movw%ax, 4(%rsp)_NEWLINE_movw%dx, 6(%rsp)_NEWLINE_movl%ecx, 8(%rsp)_NEWLINE__NEWLINE_movl$s0, %edi_NEWLINE_movw(%rsp), %si_NEWLINE_movw2(%rsp), %dx_NEWLINE_movw4(%rsp), %cx_NEWLINE_movw6(%rsp), %r8w_NEWLINE_movw8(%rsp), %r8w_NEWLINE_movw10(%rsp), %r9w_NEWLINE_movw%r9w, (%rsp)_NEWLINE_subl%eax, %eax_NEWLINE_callprintf_NEWLINE__NEWLINE_subl %eax, %eax_NEWLINE_movq%rbp, %rsp_NEWLINE_popq%rbp_NEWLINE_ret
_START_SECTION_
EAX=80000000h: サポートする最大拡張機能番号の取得
_START_PARAGRAPH_
最大の拡張機能番号をEAXに格納する。
_START_SECTION_
EAX=80000001h: 拡張プロセッサ情報とプロセッサの機能
_START_PARAGRAPH_
拡張機能フラグをEDXとECXに格納する。
_START_SECTION_
EAX=80000002h,80000003h,80000004h: プロセッサブランド文字列
_START_PARAGRAPH_
プロセッサブランド文字列をEAX, EBX, ECX, EDXに格納する。全体で48バイトのNULL終端アスキー文字列のプロセッサブラント文字列を得るために、各パラメータを順番に設定しCPUIDを呼び出す必要がある。_NEWLINE_.section.datas0:.string"Processor Brand String: %s\n".text_NEWLINE_.global main_NEWLINE__NEWLINE_.typemain, @functionmain:_NEWLINE_pushq%rbp_NEWLINE_movq%rsp, %rbp_NEWLINE__NEWLINE_subq$44, %rsp_NEWLINE_movl$0x80000002, %eax_NEWLINE_cpuid_NEWLINE__NEWLINE_movl%eax, (%rsp)_NEWLINE_movl%ebx, 4(%rsp)_NEWLINE_movl%ecx, 8(%rsp)_NEWLINE_movl%edx, 12(%rsp)_NEWLINE_addq$16, %rsp_NEWLINE__NEWLINE_movl$0x80000003, %eax_NEWLINE_cpuid_NEWLINE__NEWLINE_movl%eax, (%rsp)_NEWLINE_movl%ebx, 4(%rsp)_NEWLINE_movl%ecx, 8(%rsp)_NEWLINE_movl%edx, 12(%rsp)_NEWLINE_addq$16, %rsp_NEWLINE__NEWLINE_movl$0x80000004, %eax_NEWLINE_cpuid_NEWLINE__NEWLINE_movl%eax, (%rsp)_NEWLINE_movl%ebx, 4(%rsp)_NEWLINE_movl%ecx, 8(%rsp)_NEWLINE_movl%edx, 12(%rsp)_NEWLINE_subq$32, %rsp_NEWLINE__NEWLINE_movl$s0, %edi_NEWLINE_movq%rsp, %rsi_NEWLINE_subl%eax, %eax_NEWLINE_callprintf_NEWLINE__NEWLINE_subl%eax, %eax_NEWLINE_movq%rbp, %rsp_NEWLINE_popq%rbp_NEWLINE_ret
_START_SECTION_
EAX=80000005h: 予約
_START_PARAGRAPH_
この機能は使用されていない。
_START_SECTION_
EAX=80000006h: 拡張L2キャッシュ情報
_START_PARAGRAPH_
ECXにL2キャッシュの詳細情報を格納する。2種類の方法で表したキャッシュサイズと、キャッシュとメモリの対応を示すコードを含む。_NEWLINE_.section.datas0:.string"L2 Cache: %iMB\n".text_NEWLINE_.global main_NEWLINE__NEWLINE_.typemain, @functionmain:_NEWLINE_pushq%rbp_NEWLINE_movq%rsp, %rbp_NEWLINE__NEWLINE_movl$0x80000006, %eax_NEWLINE_cpuid_NEWLINE__NEWLINE_subl%edx, %edx_NEWLINE_movl%ecx, (%rsp)_NEWLINE_movl2(%rsp), %eax_NEWLINE_movl$1024, %ecx_NEWLINE_divl%ecx_NEWLINE__NEWLINE_movl$s0, %edi_NEWLINE_movl%eax, %esi_NEWLINE_subl%eax, %eax_NEWLINE_callprintf_NEWLINE__NEWLINE_subl %eax, %eax_NEWLINE_movq%rbp, %rsp_NEWLINE_popq%rbp_NEWLINE_ret
_START_SECTION_
EAX=80000007h: 予約
_START_PARAGRAPH_
この機能は使用されていない。
_START_SECTION_
EAX=80000008h: 仮想アドレスと物理アドレスのサイズ
_START_PARAGRAPH_
最大の仮想アドレスサイズと物理アドレスサイズをEAXに格納する。