【发布时间】:2017-04-06 09:04:17
【问题描述】:
我正在使用 Visual Studio 构建一个控制台程序,并且我在这个 C 程序中使用了内联汇编指令,如图所示:code and error message。 看不到图片的朋友,我写的代码是:
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,我不知道这个错误信息的确切翻译是什么,但粗略的意思应该是: "0x008e13c2 处有一个未处理的异常:0xC0000005:读取 0xffffffff 时发生访问冲突。"
Q1:有人知道为什么会这样吗?我不能给 DS 寄存器分配一个随机值吗?
对了,还有一个问题,当我给DS寄存器赋值0到3的时候,没有出现错误,但是Visual Studio左下角的寄存器窗口显示DS寄存器的值没有'没有改变。
Q2:为什么会这样?我是否成功地为 DS 寄存器赋值?
任何帮助将不胜感激。
【问题讨论】:
-
因为编译器生成的代码可能是使用
ds做别的事情?如果您想进行 DOS 级编程,请使用以 DOS 为目标的实际汇编程序,并使用仿真环境来运行程序。 -
04h 不是一个有效的选择器,因为它索引 LDT 中的描述符 0 且 RPL = 0(您不能使用 CPL = 3 并且保留空描述符)
-
您不能随意使用 DS 寄存器。你想达到什么目标?
-
我是汇编语言的新手,我见过一些将值移动到
ds的例子,所以我只是假设我可以为 ds 分配任何值。我使用 Visual Studio 只是因为我更熟悉这种 IDE 和 C 编程语言。 -
因为它的 CPU 在保护模式下运行。如果你想学习汇编,要么使用 8086 仿真器(实模式仿真器),要么切换到更简单的汇编语言,如 M68K 或 MIPS。
标签: c visual-studio assembly