11

いくつかの単純な OS ソース コードを調べているときに、単純なアセンブリの問題について混乱しています。

この Web サイト: http://wiki.osdev.org/Babystep7次のコードは、リアル モードからプロテクト モードに切り替えるためのものです。

mov  eax, cr0
or al,1
mov  cr0, eax

リアル モードからプロテクト モードに切り替える方法を知っています。
しかし、私の質問は、プログラムがまだリアル モードであるため、32 ビット レジスタまたは命令をどのように使用できるのでしょうか?

リアルモードで32ビットレジスタ/命令を使用することは可能ですか?

4

5 に答える 5

19

プロセッサがリアル モードで動作している場合 (ブート直後の状態)、デフォルトは 16 ビット コードです。ただし、これは32 ビット命令を使用できないという意味ではありません。

単一の命令のデフォルト モードを変更する「オペランド サイズ オーバーライド」プレフィックス (66h) があります。このプレフィックスを 16 ビット リアル モードで実行される命令で使用すると、命令が 32 ビットに切り替わります。逆に、このプレフィックスを 32 ビット プロテクト モードで実行される命令で使用すると、命令が 16 ビットに切り替わります。(同様のプレフィックス 67h は、アドレス サイズをオーバーライドするために機能します。)

このプレフィックスを使用すると、16 ビット リアル モードで 32 ビット レジスタを使用できるようになります。16 ビット コードをアセンブルするときに命令で 32 ビット オペランドを使用しようとすると、アセンブラはほぼ確実にこのプレフィックスを自動的に出力します。

残念ながら、64 ビット命令にはそのようなオーバーライド プレフィックスがないため、これらはリアル モードでは使用できません。これらを許可するには、「ロングモード」に切り替える必要があります。

于 2011-08-02T22:48:21.580 に答える
4

私の知る限り、リアル モードは CPU で実行できるコマンドには影響しませんが、CPU メモリ参照コマンドの解釈方法に影響します。

はい、使用できますが、メモリセルeaxを取得することはできません。[eax]

Intel のマニュアルの関連部分を参照してください。

于 2011-08-02T19:38:58.350 に答える
0

単純なアドレス指定では、オペランドと命令サイズのプレフィックスが非常にうまく機能しました。私がかつて Windows (3.1 以降から 9x) 用に作成した 16 ビット プロテクト (最初はリアル) モードのアプリケーションは、Windows メモリ API を使用して 64K を超えるメモリ領域を割り当てることができ、問題はそれをどのように利用するかでした。いずれにせよ、(far) ポインター サンクと前述のプレフィックスを使用すると、アプリは 16 ビット モードで実行されていたにもかかわらず、40 MB の領域を有効に活用できました。

同様のことを試みる場合は、命令サイズの接頭辞により、16 ビットと互換性のない 32 ビット命令セットが有効になることに注意してください。16 ビットは通常、セグメント演算を行っていない限り、リアル モードかプロテクト モードかを気にしません。だから、あなたのコンパイラはおそらく血まみれの殺人を叫ぶことなくそれらを生成しないので、emit を使用して 32 ビット操作のコードを渡す必要があります (少なくとも私はそうしました)。

于 2012-05-22T18:32:12.460 に答える
-2

おそらく、16 ビット リアル モードで 32 ビット アクセスを可能にする LoadAllオペコード 0F07hを使用できます。

于 2012-06-05T07:26:33.043 に答える