x86の `ud2` が「2」なのは、先に `ud0` と `ud1` があったから
x86 の命令列を見ていて `ud2` に出会うと、ちょっと不思議に感じる。どちらかというと「未定義命令」という雑な名前で十分に見えるのに、わざわざ 2 が付いているからだ。Raymond Chen の短い記事は、その素朴な疑問に対して、Intel の仕様と現場の歴史がどう重なって今の形になったのかをたどっている。単なる命名の話に見えるが、実際には「何を壊してよいのか」「どの挙動を仕様として保証するのか」という、CPU 設計のかなり大事な話でもある。 記事の出発点は、x86 のコンパイラ出力や、API を横取りするようなソフトウェアのクラッシュ解析で `ud2` を見かけることだ。`ud2` は architecturally undefined instruction、つまりアーキテクチャ上「未定義」とされる命令で、実行されると必ず “invalid opcode” 例外を起こす。コンパイラはこれを、そこに来ては困る場所の目印として使う。たとえば `[[noreturn]]` が付いた関数が、理屈の上では戻らないはずなのに戻ってきてしまった場合、その直後に `ud2` を置いておけば
papoo.work