鱼C论坛

 找回密码
 立即注册
查看: 3217|回复: 2

[已解决]执行了这段汇编代码后,一进入循环s:,dosbox就出现无线循环卡死的情况

[复制链接]
发表于 2022-3-10 11:19:46 | 显示全部楼层 |阅读模式
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

分割-----------------------------------------------
BLTQWPB~@JB07@%BKKW3TH1.jpg
最佳答案
2022-3-10 11:19:47
本帖最后由 jackz007 于 2022-3-11 16:14 编辑

      这个代码向内存地址 2:0000 ~ 2:003e 对应于绝对地址 00020 ~ 0005e,这个地址属于操作系统非常重要的中断向量表的存储空间(00000 ~ 003ff),是任何一个程序都不能随便写入数据的内存区域,因为操作系统的正常运转需要依赖这片内存区域。
      应该在程序代码中开辟用于存储写入 63 个字节数据的专用存储空间,这样,就不会直接危害到 DOS 操作系统了。
  1. assume cs:code , ds:data
  2. data segment para public 'DATA'
  3.      db 40h dup(0)
  4. data ends
  5. stack segment para stack 'STACK'
  6.      db 400h dup(0)
  7. stack ends
  8. code segment para public 'CODE'
  9. start: mov ax,data
  10.        mov ds,ax
  11.        mov bx,0
  12.        mov ax,0
  13.        mov cx,63
  14. s:     mov [bx],al
  15.        inc bx
  16.        inc al
  17.        loop s
  18.        mov ax,4c00h
  19.        int 21h
  20. code ends
  21. end start
复制代码

       在编译完代码,使用 debug.exe 开始跟踪之前,仔细观察一下 SS、SP 寄存器的数值,看看和你之前编译的程序有什么区别?

最佳答案

查看完整内容

这个代码向内存地址 2:0000 ~ 2:003e 对应于绝对地址 00020 ~ 0005e,这个地址属于操作系统非常重要的中断向量表的存储空间(00000 ~ 003ff),是任何一个程序都不能随便写入数据的内存区域,因为操作系统的正常运转需要依赖这片内存区域。 应该在程序代码中开辟用于存储写入 63 个字节数据的专用存储空间,这样,就不会直接危害到 DOS 操作系统了。 在编译完代码,使用 debug.exe 开始跟踪之前,仔细观察一 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-10 11:19:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-3-11 16:14 编辑

      这个代码向内存地址 2:0000 ~ 2:003e 对应于绝对地址 00020 ~ 0005e,这个地址属于操作系统非常重要的中断向量表的存储空间(00000 ~ 003ff),是任何一个程序都不能随便写入数据的内存区域,因为操作系统的正常运转需要依赖这片内存区域。
      应该在程序代码中开辟用于存储写入 63 个字节数据的专用存储空间,这样,就不会直接危害到 DOS 操作系统了。
  1. assume cs:code , ds:data
  2. data segment para public 'DATA'
  3.      db 40h dup(0)
  4. data ends
  5. stack segment para stack 'STACK'
  6.      db 400h dup(0)
  7. stack ends
  8. code segment para public 'CODE'
  9. start: mov ax,data
  10.        mov ds,ax
  11.        mov bx,0
  12.        mov ax,0
  13.        mov cx,63
  14. s:     mov [bx],al
  15.        inc bx
  16.        inc al
  17.        loop s
  18.        mov ax,4c00h
  19.        int 21h
  20. code ends
  21. end start
复制代码

       在编译完代码,使用 debug.exe 开始跟踪之前,仔细观察一下 SS、SP 寄存器的数值,看看和你之前编译的程序有什么区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-11 08:16:53 | 显示全部楼层
写入非法地址,应该是 mov ax,0020h
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-7 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表