|
2鱼币
本帖最后由 DSFEF 于 2022-3-10 11:20 编辑
执行了这段汇编代码后,一进入循环s:,dosbox就出现无线循环卡死的情况,有知道的吗,大神们帮忙看看
assume cs:code
code segment
start: mov ax,0002h
mov ds,ax
mov bx,0
mov ax,0
mov cx,63
s: mov [bx],al
inc bx
inc al
loop s
mov ax,4c00h
int 21h
code ends
end start
分割-----------------------------------------------
本帖最后由 jackz007 于 2022-3-11 16:14 编辑
这个代码向内存地址 2:0000 ~ 2:003e 对应于绝对地址 00020 ~ 0005e,这个地址属于操作系统非常重要的中断向量表的存储空间(00000 ~ 003ff),是任何一个程序都不能随便写入数据的内存区域,因为操作系统的正常运转需要依赖这片内存区域。
应该在程序代码中开辟用于存储写入 63 个字节数据的专用存储空间,这样,就不会直接危害到 DOS 操作系统了。
- assume cs:code , ds:data
- data segment para public 'DATA'
- db 40h dup(0)
- data ends
- stack segment para stack 'STACK'
- db 400h dup(0)
- stack ends
- code segment para public 'CODE'
- start: mov ax,data
- mov ds,ax
- mov bx,0
- mov ax,0
- mov cx,63
- s: mov [bx],al
- inc bx
- inc al
- loop s
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码
在编译完代码,使用 debug.exe 开始跟踪之前,仔细观察一下 SS、SP 寄存器的数值,看看和你之前编译的程序有什么区别?
|
最佳答案
查看完整内容
这个代码向内存地址 2:0000 ~ 2:003e 对应于绝对地址 00020 ~ 0005e,这个地址属于操作系统非常重要的中断向量表的存储空间(00000 ~ 003ff),是任何一个程序都不能随便写入数据的内存区域,因为操作系统的正常运转需要依赖这片内存区域。
应该在程序代码中开辟用于存储写入 63 个字节数据的专用存储空间,这样,就不会直接危害到 DOS 操作系统了。
在编译完代码,使用 debug.exe 开始跟踪之前,仔细观察一 ...
|