2016-11-22 7 views
0

私はVisual Studioを使用してコンソールプログラムを作成しています。このCプログラムでは図のようにインラインアセンブリ命令を使用しています:code and error message。絵を見ることができない人のために 、私が書いたコードは次のとおりです。"mov ds、ax"はVisual Studioで0xC0000005エラーを表示します

void main() { 
    __asm { 
     mov ax, 0x4; 
     mov ds, ax; // 0xC0000005 error occurs while executing this instruction 
     xor eax, eax; 
    } 
} 

あなたが見ることができるように、私はDSセグメントレジスタに値を代入するトリング午前、と私はAXを使用しました値をDSレジスタに転送します(DSレジスタに直接値を割り当てていません)。

コンパイルとリンクはどちらもOKですが、このプログラムをデバッグするとエラーコード0xC0000005が表示されます。デバッグせずに実行すると、同じエラーが発生します。

私は、Visual Studioの中国語版を使用している、と私は、このエラーメッセージの正確な翻訳だかわからないんだけど、それは大まかな意味があることshouleだ: "0x008e13c2で未処理の例外があります:0xc0000005では:アクセスを0xffffffffの読み取り中に競合が発生しました "

Q1:これが起こっている理由を知っている人はいますか? DSレジスタにランダムな値を割り当てることはできませんか?

ちなみに、DSレジスタに0〜3の番号を割り当てると、エラーは発生しませんが、Visual Studioの左下にあるレジスタウィンドウには、のDSレジスタの値は表示されません変更されました

質問2:どうしてですか?私はDSレジスタに値をうまく割り当てたかどうか?

ご協力いただければ幸いです。

+0

コンパイラによって生成されたコードはおそらく他に何かのために 'ds'を使用しているでしょうか? DOSレベルのプログラミングを行う場合は、DOSをターゲットとする実際のアセンブラを使用し、エミュレートされた環境を使用してプログラムを実行します。 –

+1

04hは、RPL = 0(CPL = 3を使用できず、nullディスクリプタが予約されている)では使用できないLDT内のディスクリプタ0をインデックスする有効なセレクタではありません。 –

+2

DSレジスタでうろ覚えすることはできません。達成しようとしていることは何ですか? –

答えて

4

Visual StudioはWindowsで実行され、WindowsはCPUをprotected mode (PM)に切り替えます。
PMでは、dsのようなセレクタ・レジスタを任意の値に割り当てることはできませんが、OSはそれらのレジスタをロードします。

OSがこの側面で欠陥がなく、Windowsがそうでないと仮定すると、他の値(但し、他のセレクタレジスタ上のもの)は例外をトリガします。あなたは

mov ax, cs 
mov ds, ax 

mov ax, 0b800h 
mov es, ax 

mov ax, ... 
mov ds, ax 

のようなコードを見ている場合は


は、その後、それはreal modeコードだと、もう Windows上で実行するのには適していません。
DOSエミュレータ(DOSBoxなど)と、16ビット実行可能ファイル(NASMMASMTASM、またはTurbo Cなど)を生成できるアセンブラ/コンパイラを使用することを検討してください。


値00H - それらはすべてと

NULLセグメントセレクタ(値0000から0003)は、DSにロードすることができるNULLセレクタを表すよう03Hは、この態様では特別なES、FS、およびGSレジスタへのアクセスを許可しません。 保護例外はありません。しかし、対応するセグメント レジスタがNULL値でロードされているセグメントを参照しようとすると、一般保護例外(#GP)が発生し、メモリ参照は発生しません。

値04hはNULLディスクリプタを参照しておらず、dsを設定するとすぐに例外が発生します。


は、実際にOSは、ユーザ空間プログラムにアクセス可能な他の記述子を作成することがありますが、仮定がなされて、その使用は、レジスタ内に既に存在するものと同等になります。したがって、それらを変更する点はありません。

実際には32ビットバージョンのWindowsでは16ビットプログラムがサポートされますが、Vistaでは64ビットバージョンではサポートされません。とにかくVisual StudioはMZ exesを生成できません。@ RossRidgeのコメントに従って、Visual C++ 1.5以上が必要です。

+0

@RossRidgeありがとう!進行中の訂正! –

関連する問題