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バイト命令である理由も、デコード時のページ境界問題と関係している。
十分な数のユーザーがいれば、観測可能なあらゆる挙動は誰かに依存される。
HNでの議論
62- hacker_homie
こうしてついに0F FF信者たちは報われた。彼らにはオペコードUD0という名誉が与えられ、これが唯一にして真のオリジナル不正オペコードとなった。0F B9信奉者たちはUD1という恥辱を永久に負わされることになったのだ。
- 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に終端されたバスにとって重要だ。
- gtirloni
最近、ランダムに失敗するビルドをデバッグしなければならなかったが、V8からのud2がそこで私を待っていた。
- Neywiny
私はx86の人ではないが、他のアーキテクチャではソフトウェア割り込み/例外を発生させられる。x86にはこれがないのか、それともそうした機能は十分なユースケースをカバーしていなかったのか?
- ordu
> 0F FF版が遡ってud0と名付けられ、0F B9版が遡ってud1と名付けられ、ud2が推奨される未定義オペコードとして残ったから、ud2と呼ばれている。
読者としてこれは驚きだった。この文にたどり着いたとき、0f ffが#1になり、0fb9が#2になると思い込んでいた。しかし違う、Intelはゼロから数えるので、3つ目のudが存在するのだ。