2016-09-25 3 views
1

私はいくつかを確認したい。私は8086用のアセンブリ言語プログラムを作成しています。 masm611アセンブラを使用してアセンブリしています。私が実行し、32ビットウィンドウでコマンドプロンプトの下で8086 16ビットリアルモードプログラムをデバッグすると、実際のCPUレジスタとメモリを使用して修正しますか?プログラムはWindows 32bitで仮想モード86で動作しますか?また16ビットプログラムは32ビットOS上の仮想8086モードで動作しますか?

、私は以下のようにPWBのMicrosoftプログラマのワークベンチでのCodeViewデバッガを使用してプログラムをデバッグする場合:

PWB

8086 assembly language program with debugger running http://i65.tinypic.com/35cej2e.jpg

のCodeViewデバッガのレジスタやメモリの値かどうかを確認してください。ハードウェアの実際の値であり、変化しています。また、私はPWBでプログラムを実行すると、実際のハードウェアをWindows 32ビットで使用します。

+0

メモとして、コードが実行されている環境をより詳細に制御する必要がある場合は、仮想マシンの使用を検討することをお勧めします。 –

答えて

5

32ビットバージョンのWindowsの下でWindowsコマンドプロンプトからMS-DOSプログラムを実行すると、リアルモードをエミュレートするために仮想8086モードを使用するNTVDMで実行されます。実行中のプログラムは、通常どおりCPUのレジスタを使用します。しかし、実モードで動作するコードと同じようにメモリを使用しません。

Windowsは、他のWindowsアプリケーションの直接アクセスと同じように、NTVDMおよびその下で実行されるプログラムに物理メモリへの直接アクセスを許可しません。代わりに、プログラムによるメモリへのアクセスは、ページテーブルを介して線形アドレスから物理アドレスに変換される。つまり、MS-DOSアプリケーションがメモリ位置074B:0000に書き込む場合、CPUはこれをリニアアドレス000074B0に変換し、次にページテーブルルックアップを使用して、Windowsによって選択された完全に異なる物理アドレスに変換します。 Windowsでは、NTVDMまたはその下で実行されるアプリケーションがデバイスハードウェアへのアクセスを許可しないため、デバイスメモリへのアクセスはすべてNTVDMによってブロックまたはエミュレートされます。

また、使用しているCodeViewのバージョンが、デバッグ対象のプログラムと同じ実際のCPUレジスタを使用する仮想8086モードのアプリケーションとしても動作するMS-DOSアプリケーションであることにも注意してください。これは、CodeViewがデバッグされたプログラムのレジスタを表示するときに、プログラムが停止しCodeViewが引き継いだ時点でレジスタにあった値を示していることを意味します。 CodeViewは、独自の使用のためにレジスタを必要とするため、デバッグされたプログラムのレジスタをどこかのメモリに保存することが、制御を取得したときの最初の作業です。

+0

私はデバッガでの作業経験がありません。以下の文章を確認してください。 1)命令は実際にはプロセッサによってコードビューで実行されます。 2)それ自身のためにレジスタを使用しています。したがって、デバッガに表示されているレジスタのいくつかの値は、レジスタ内の実際の値とは異なります。 3)mov AX、0の実行後、CVはAXの値をメモリに移動し、AXレジスタをそれ自身の目的のために使用することができます。 4)デバッガに表示されるメモリの内容は、実際には異なる場所にありますが、物理メモリに存在します。 – user2277648

+0

@ user2277648 1)はい、2)表示されている時点で異なります3)MOV命令の後CPUがデバッガに入ると(ブレークポイントやシングルステップなど)、デバッガはレジスタの内容をメモリに保存します。4)メモリの内容はおそらくどこかの物理RAMにあります。彼らは、デバッガが内容を読み込んで表示する必要がありましたが、Windowsはその内容をディスク上のスワップファイルに保存して以来、RAM内の他の場所のためのスペースを確保することができました。もう一度アクセスすると、Windowsは透過的にメモリをコピーすることができます –

+0

ありがとうala dear – user2277648

関連する問題