DSFEF 发表于 2022-3-10 11:19:46

执行了这段汇编代码后,一进入循环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-10 11:19:47

本帖最后由 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 寄存器的数值,看看和你之前编译的程序有什么区别?

苏小白 发表于 2022-3-11 08:16:53

写入非法地址,应该是 mov ax,0020h
页: [1]
查看完整版本: 执行了这段汇编代码后,一进入循环s:,dosbox就出现无线循环卡死的情况