执行了这段汇编代码后,一进入循环s:,dosbox就出现无线循环卡死的情况
本帖最后由 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 ,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 ,al
inc bx
inc al
loop s
mov ax,4c00h
int 21h
code ends
end start
在编译完代码,使用 debug.exe 开始跟踪之前,仔细观察一下 SS、SP 寄存器的数值,看看和你之前编译的程序有什么区别?
写入非法地址,应该是 mov ax,0020h
页:
[1]