私は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レジスタに値をうまく割り当てたかどうか?
ご協力いただければ幸いです。
コンパイラによって生成されたコードはおそらく他に何かのために 'ds'を使用しているでしょうか? DOSレベルのプログラミングを行う場合は、DOSをターゲットとする実際のアセンブラを使用し、エミュレートされた環境を使用してプログラムを実行します。 –
04hは、RPL = 0(CPL = 3を使用できず、nullディスクリプタが予約されている)では使用できないLDT内のディスクリプタ0をインデックスする有効なセレクタではありません。 –
DSレジスタでうろ覚えすることはできません。達成しようとしていることは何ですか? –