学校では、ブートストラッププログラムを使用して、オペレーティングシステムなしでスタンドアロンプログラムを実行しています。私はこのプログラムを研究してきましたが、プロテクトモードを有効にすると、プログラム内でオペコードとオペランドをデータとして直接アセンブルすることで、はるかに大きなジャンプが実行されます。これはGNUアセンブラ用でした:
/* this code immediately follows the setting of the PE flag in CR0 */
.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
まず第一に、なぜ(命令ニーモニックの代わりに)これを実行したいのでしょうか?
私はIntelのマニュアルを見てきましたが、それでもコードに少し混乱しています。具体的には、ボリューム2A、3-549ページに、オペコードの表があります。関連するエントリ:
EA * cp * JMP ptr16:32Inv。有効なジャンプファー、アブソリュート、アドレス オペランド
実際のオペコードは明らかですが、最初のバイトである0x66は私を混乱させます。Intelマニュアルの表を参照すると、cpは明らかに6バイトのオペランドが続くことを意味します。そして明らかに次の2行に6バイトが続きます。0x66は、「オペランドサイズのオーバーライドプレフィックス」をエンコードします。これはテーブルのcpと何の関係がありますか?cpには16進値があると思っていましたが、代わりにこのオーバーライドプレフィックスがあります。誰かが私のためにこれを片付けてくれませんか?
これがodからのダンプです:
c022 ** ea66 0000 0001 0010 ** ba52 03f2 c030
TARGET_ADDRESSは0x00010000として定義されました。
また、最後の2バイトの重要性にも少し混乱しています。しかし、それはまったく別の質問のようです。かなり遅くなっていて、コードとIntelのマニュアルを何時間も見つめているので、自分の主張が理解できたと思います。
見てくれてありがとう!