まずは、EFLAGSのチェック
CPUID命令が使用可能かどうかは、EFLAGSの21ビット目が、変更可能かどうかで判定する。
というわけで、やってみる。
; フラグのbit21をオンにする PUSHFD ; フラグレジスタの内容を退避 POP EAX ; フラグレジスタの内容をEAXレジスタに転写 BTS EAX, 21 ; EAXレジスタの21bit目をテスト&セット PUSH EAX ; EAXレジスタの内容を退避 POPFD ; EAXレジスタの内容をフラグレジスタに転写 ; フラグのbit21がオンかチェック PUSHFD ; フラグレジスタの内容を退避 POP EAX ; フラグレジスタの内容をEAXレジスタに転写 BTR EAX, 21 ; EAXレジスタの21bit目をテスト&リセット
BTSやBTRは、指定フラグの値をキャリーフラグに設定してから、
指定フラグをセットorリセットするので、
BRT実行後に、キャリーフラグがオンであれば、CPUID命令が使用可能という事になる。
しかし、フラグの扱いって面倒だ...
いや、そんな事を言ったら、80x86って面倒だ...
って、それを言っちゃ、身も蓋も... 苦笑