x86の未定義命令はなぜ「ud2」なのか、その「2」の由来

Why is the x86 undefined instruction called ud2? Why 2?

x86コンパイラが「到達不能」コードの目印に使うud2は、なぜudではなくud2なのか。元々x86に公式の未定義命令はなく、開発者は0F FFや0F B9といったバイト列で不正オペコード例外を起こしていた。Intelが新プロセッサで挙動を変えたことで、これらの命令に依存するソフトが動かなくなり、Hyrumの法則が露呈。0F FFはud0、0F B9はud1と遡って命名され、推奨されるud2が生まれた。ud2がパラメータを持たない2バイト命令である理由も、デコード時のページ境界問題と関係している。

十分な数のユーザーがいれば、観測可能なあらゆる挙動は誰かに依存される。
  1. hacker_homie

    こうしてついに0F FF信者たちは報われた。彼らにはオペコードUD0という名誉が与えられ、これが唯一にして真のオリジナル不正オペコードとなった。0F B9信奉者たちはUD1という恥辱を永久に負わされることになったのだ。

  2. 349ru3h4f03

    今日ではUD0、UD1、UD2はSDMとAPMに載っている。

    我々はUDB(D6)も手に入れた。64ビットモードのためにx86-64とともに登場した1バイト版だ。

    そして我々は常にUDW(FF FF)を持ってきた。別名グループ#5(最初のFF)で、modrmバイトはmod=11b r/m=111b(/7)reg=111b(2番目のFF)——これは全ビットが1にセットされたメモリや、どのデバイスもアクセスを要求しないときに全1に終端されたバスにとって重要だ。

  3. gtirloni

    最近、ランダムに失敗するビルドをデバッグしなければならなかったが、V8からのud2がそこで私を待っていた。

  4. Neywiny

    私はx86の人ではないが、他のアーキテクチャではソフトウェア割り込み/例外を発生させられる。x86にはこれがないのか、それともそうした機能は十分なユースケースをカバーしていなかったのか?

  5. ordu

    > 0F FF版が遡ってud0と名付けられ、0F B9版が遡ってud1と名付けられ、ud2が推奨される未定義オペコードとして残ったから、ud2と呼ばれている。

    読者としてこれは驚きだった。この文にたどり着いたとき、0f ffが#1になり、0fb9が#2になると思い込んでいた。しかし違う、Intelはゼロから数えるので、3つ目のudが存在するのだ。

この日のほかの記事

2026-09-13