WinXPDOSボックスで実行されている16ビットのTurboPascal7プログラム(質問しないでください...)で高性能カウンターを使用しようとしています。インライン$0F、$ 31でRDTSC命令を実行でき、AXとDXの内容は適切な値のように設定されていますが、EAX、EDXの上半分にアクセスして、結果を2つのロングワードグローバル変数に書き込むにはどうすればよいですか?
2 に答える
ドキュメントを正しく読めば、オペコードに 0x66 プレフィックスを使用することで、リアル モードから 32 ビット レジスタにアクセスできます。したがって、「$66 $50」をインライン化すると、次のような効果が得られます: EAX が 32 ビット値としてスタックにプッシュされます。次に、下半分と上半分を 2 つの通常の (16 ビット)pop
オペコードとしてポップします (最初に下半分を取得します)。EDX の場合、「$50」ではなく「$52」を使用します。
(私はこれを試していません。)
DOS で 32 ビット レジスタを使用するには、DOS エクステンダまたはフラット リアル モードが必要です。前者はプロテクト モード (コード生成モデルをどこかで切り替える必要があります) 用のプログラムを作成できるようになり、後者は一種の 32 ビット リアル モードになります。DOS ボックスで動作するとは思えませんが、DOS エミュレーターで動作する可能性があります。
私の知る限り (15 年...) Borland Pascal には、独自の DOS エクステンダ、RTM.EXE などがあります。
フラットリアルモードへの切り替え: http://www.assembly.happycodings.com/code54.html