CPUID
CPUID命令の呼び出し
CPUID命令は、EAXレジスタが暗黙のオペランドであり、それ以外の（明示的な）オペランドは無い。どのような情報を返すべきかを指定する値をEAXレジスタに設定し、CPUID命令を実行する。まずEAX = 0でCPUIDを呼び出し、CPUでサポートされている最大のパラメータを取得するべきである。CPUIDの拡張機能情報を取得する場合は、EAXのビット31をセットしてCPUIDを呼び出す。拡張機能情報でサポートされている最大の機能番号を得るためには、EAX = 8000000hでCPUIDを呼び出す。
EAX=2: キャッシュとTLBディスクリプタ情報
これは、キャッシュとTLBの機能を示すディスクリプタのリストをEAX, EBX, ECX, EDXレジスタに格納する。
EAX=3: プロセッサ・シリアル・ナンバ
これは、プロセッサのシリアル番号を返す。プロセッサ・シリアル・ナンバは、インテルがPentium IIIで導入したが、プライバシーの懸念のためにこの後のモデルでは実装されていない（PSN機能ビットは常にクリアされている）。トランスメタのEfficeonとCrusoeプロセッサはこの機能を提供している。AMDは、この機能をどのCPUにも実装しなかった。
インテルPentium IIIでは、シリアル番号はEDX:ECXレジスタに格納される。トランスメタのEfficeonではEBX:EAXレジスタに、CrusoeではEBXレジスタだけに格納される。
プロセッサ・シリアル・ナンバ機能を使用するためには、BIOSの設定を有効にする必要があることに注意すべきである。
.section.datas0:.string "Processor serial number: %.4hX-%.4hX-%.4hX-%.4hX-%.4hX-%.4hX\n".text
.global main

.typemain, @functionmain:
pushq%rbp
movq%rsp, %rbp

movl$1, %eax
cpuid

subq$4, %rsp
movl%eax, (%rsp)
movq2(%rsp), %rbx
movw%bx, (%rsp)
movw%ax, 2(%rsp)

movl$3, %eax
cpuid

movl%edx, 4(%rsp)
movq6(%rsp), %rax
movw%ax, 4(%rsp)
movw%dx, 6(%rsp)
movl%ecx, 8(%rsp)

movl$s0, %edi
movw(%rsp), %si
movw2(%rsp), %dx
movw4(%rsp), %cx
movw6(%rsp), %r8w
movw8(%rsp), %r8w
movw10(%rsp), %r9w
movw%r9w, (%rsp)
subl%eax, %eax
callprintf

subl %eax, %eax
movq%rbp, %rsp
popq%rbp
ret
EAX=80000000h: サポートする最大拡張機能番号の取得
最大の拡張機能番号をEAXに格納する。
EAX=80000001h: 拡張プロセッサ情報とプロセッサの機能
拡張機能フラグをEDXとECXに格納する。
EAX=80000002h,80000003h,80000004h: プロセッサブランド文字列
プロセッサブランド文字列をEAX, EBX, ECX, EDXに格納する。全体で48バイトのNULL終端アスキー文字列のプロセッサブラント文字列を得るために、各パラメータを順番に設定しCPUIDを呼び出す必要がある。
.section.datas0:.string"Processor Brand String: %s\n".text
.global main

.typemain, @functionmain:
pushq%rbp
movq%rsp, %rbp

subq$44, %rsp
movl$0x80000002, %eax
cpuid

movl%eax, (%rsp)
movl%ebx, 4(%rsp)
movl%ecx, 8(%rsp)
movl%edx, 12(%rsp)
addq$16, %rsp

movl$0x80000003, %eax
cpuid

movl%eax, (%rsp)
movl%ebx, 4(%rsp)
movl%ecx, 8(%rsp)
movl%edx, 12(%rsp)
addq$16, %rsp

movl$0x80000004, %eax
cpuid

movl%eax, (%rsp)
movl%ebx, 4(%rsp)
movl%ecx, 8(%rsp)
movl%edx, 12(%rsp)
subq$32, %rsp

movl$s0, %edi
movq%rsp, %rsi
subl%eax, %eax
callprintf

subl%eax, %eax
movq%rbp, %rsp
popq%rbp
ret
EAX=80000005h: 予約
この機能は使用されていない。
EAX=80000006h: 拡張L2キャッシュ情報
ECXにL2キャッシュの詳細情報を格納する。2種類の方法で表したキャッシュサイズと、キャッシュとメモリの対応を示すコードを含む。
.section.datas0:.string"L2 Cache: %iMB\n".text
.global main

.typemain, @functionmain:
pushq%rbp
movq%rsp, %rbp

movl$0x80000006, %eax
cpuid

subl%edx, %edx
movl%ecx, (%rsp)
movl2(%rsp), %eax
movl$1024, %ecx
divl%ecx

movl$s0, %edi
movl%eax, %esi
subl%eax, %eax
callprintf

subl %eax, %eax
movq%rbp, %rsp
popq%rbp
ret
EAX=80000007h: 予約
この機能は使用されていない。
EAX=80000008h: 仮想アドレスと物理アドレスのサイズ
最大の仮想アドレスサイズと物理アドレスサイズをEAXに格納する。