概要
x86アーキテクチャ でレジスタをゼロクリアする代表的な方法について解説。 xor eax, eax 命令がなぜ主流になったのか、その理由と歴史的経緯を整理。 sub eax, eax との比較や、CPU設計上の最適化事情も紹介。 Intelなどの CPUメーカーの対応 や、他アーキテクチャ(Itanium)との違いも触れる。 実際のアセンブリコードの現場でのエピソードも交えて解説。
x86コンパイラがxor eax, eaxを好む理由
- xor eax, eax は、x86でレジスタをゼロにする最も コンパクトな方法
- mov eax, 0 よりも 命令サイズが小さい (movは即値エンコードで4バイト必要)
- x86には ゼロレジスタが存在しない ため、都度ゼロ化が必要
- xor 命令のほかにも sub eax, eax などゼロ化できる命令は存在
- ただし、xorが主流になった理由は明確ではなく、 慣習や偶然 が影響した可能性
xor eax, eaxとsub eax, eaxの比較
- バイト数、 実行サイクル数 ともに同じ
- フラグレジスタ(EFLAGS)の影響
- xor eax, eax:AF(補助キャリーフラグ)は 未定義
- sub eax, eax:AFは クリア される
- その他のフラグ(OF, SF, ZF, PF, CF)はどちらもゼロ化に適切な状態
なぜxorが主流になったのか
- 初期のコンパイラが xorを選択 したことで、そのまま 慣習化
- 「コンパイラがそうしているから正しいはず」という 集団心理
- Intelは両命令に 特別な最適化(命令デコーダでの検出・依存性解消) を実装
- 入力に依存せず、 ゼロレジスタへのリネーム で実質「0サイクル」動作
- ただし他のCPUベンダーは xorのみ特別扱い のケースがあるため、xorの優位性が確定
余談・実際の現場エピソード
- sub r, r を使う開発者も存在し、アセンブリコードで 個性が出る
- Itaniumアーキテクチャ ではxorトリックは NaTビットがリセットされない ため無効
- Itaniumには 専用ゼロレジスタ が存在し、直接ゼロを代入可能
著者・背景情報
- 著者 Raymond はWindows開発に30年以上携わるエンジニア
- The Old New Thing というWebサイト・書籍の作者
- Windows Dev Docs Twitterアカウントでも活動
- 技術的な話題から雑談まで幅広く発信