EIPに足す値(1バイト)という形式も使える。翻訳するとどうなるの?・・・頭に66が追加されます。いうかこの程度のことは自分でちょっとプログラムを書いて、naskの.lstを見て自分で突き止めましょう。すれば力がつきますよ。次の1命令に限って逆にする機械語です。定数みたいにすれば分かりやすくて良さそうなのに。実はそのような機械語もあります。定数(4バイト)というのがあるのです。確かにこの形式のほうが人間には分かりやすいとはいえるでしょう。この書き方だとMOV命令は3バイト命令や6バイト命令になってしまいます。MOV命令はとてもよく使う命令なので、もし短く書ける形式があるのなら、そちらを使うほうがプログラムが短くなって、動作が速くなります(註:キャッシュヒット率が上がるので)。それでアセンブラは基本的に短く書ける形式のほうの機械語しか出力しないようになっています。同様にPUSHやPOPも2バイト形式がありますが、やはり同じ理由で1バイト形式を使うのが普通です。そんなによく使う命令なのかなあ。例外の割り込み番号の一つで、ブレークポイント割り込みです。これは何かというと、今ここにバグがありそうな機械語のプログラムがあって、特に0x1234番地の命令を実行するときが怪しいとしましょう。そのときのレジスタの値を画面に表示させてチェックしようと考えました。そんなとき、0x1234にJMP命令とかCALL命令を置いて、レジスタ表示ルーチンを呼び出せばいいでしょう。ああしかし、実は0x1234番地の命令は1バイト命令(たとえばRETとか)で、その次の0x1235番地からはテストに必要なデータが入っているんですよ。0x1234番地に5バイト命令のCALLなんて書いてしまったら、テスト結果がおかしくなってしまいます。普通のINT命令なら2バイトで済みますが、それでも長すぎます。アセンブラのソースが手元にあればそこに命令を追加してアセンブルしなおせばいいのかもしれませんが、命令を挿入すると番地がずれて結果が変わることもたまにはありますし、アセンブラのソースはないけど、とにかくバグを見つけて報告しなければいけない、というむごい状況もたまにはあるのです。そんなときに1バイトで関数を呼び出す機能があれば、ものすごく重宝なのです。そのときのための割り込み命令です。使うわけでもないのに、1バイト形式が特別に用意されているわけです。そんなわけで、「お、1バイトでかけるINT命令があるのか。これをAPIの呼び出しに使ったら、アプリケーションはきっと短くなるぞ。APIを呼び出すためのINTはアプリケーションの中に何度も何度も出てくるから、これは結構効果がありそうだ。」なんて考えちゃダメなんです。使うことはできないのかよ、不便だなあ。」って言われちゃうことになるかもしれないわけです。分かりにくいし、CPUは代入の代わりに内部で計算しなきゃいけなくなるから、かえって疲れちゃう気がするんだけど。