鱼C论坛

 找回密码
 立即注册
查看: 2068|回复: 1

dos界面貌似卡死在死循环,但是debug调试能正常退出

[复制链接]
发表于 2022-9-20 11:35:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
按照王爽汇编第四版实验10
显存上面写内容
除法运算
这两个函数分开单独运行都很正常。
结合到一起以后直接运行就直接卡死了,我debug去走一遍,里面可以正常运行到int 21h
我不明白到底哪儿出问题了
  1. assume cs:code,ds:data
  2. data segment
  3.     dw 12666,444,1,8,3,38
  4.     db 30 dup(0)
  5. data ends
  6. code segment
  7.     begin:
  8.     mov ax,data
  9.     mov ds,ax
  10.     mov si,0  
  11.     mov bx,10
  12.     mov cx,6
  13.     mov di,16

  14.     s1:
  15.     call dtoc           ;调用函数dtoc
  16.     add si,2
  17.     loop s1            

  18.     mov si,16           ;为调用函数show_str前做必要参数的初始化
  19.     mov dh,2
  20.     mov dl,3
  21.     mov cl,2
  22.     call show_str       ;调用函数show_str

  23.     mov ax,4c00h        ;退出程序
  24.     int 21h


  25.     dtoc:               ;进入函数dtoc,保存变量si,cx
  26.     push si
  27.     push cx
  28.     mov ax,ds:[si]      ;将需要运算的被除数放入ax
  29.     mov si,0            ;si置0,作为压栈计数器
  30.     instack:            ;数内循环,将数据进制转为10进制每位数存入一个字节单元
  31.     div bx              ;除数(bx)=10
  32.     add dx,30h          ;余数(dx)=(dx)+30h为10进制每位数的ascii码
  33.     push dx             ;余数(dx)压栈
  34.     inc si              ;用si计算压栈次数
  35.     mov dx,0
  36.     mov cx,ax
  37.     jcxz ok      
  38.     jmp instack
  39.     ok:
  40.     mov cx,si           ;cx计算将要出栈的次数
  41.     outstack:
  42.     pop ds:[di]
  43.     inc di
  44.     loop outstack
  45.     pop cx              ;还原变量cx,si
  46.     pop si
  47.     ret                 ;函数dtoc返回


  48.     show_str:           ;进入函数show_str
  49.     push cx
  50.     mov ax,0B800H
  51.     mov es,ax           ;es为0B800h显存的段地址

  52.     mov cx,2000         ;设定循环2000次,正好完整清屏
  53.     mov al,0h
  54.     mov di,0
  55.     init:               ;初始化清屏开始
  56.     mov es:[di],al
  57.     add di,2
  58.     loop init


  59.     mov al,80           ;计算应该从显存的哪一个地址开始存数据
  60.     sub dh,1
  61.     mul dh
  62.     sub dl,1
  63.     mov dh,0
  64.     add ax,dx
  65.     add ax,ax
  66.     mov di,ax

  67.     pop cx              ;字体颜色存放进bl
  68.     mov bl,cl
  69.     s:
  70.     mov ch,0
  71.     mov cl,ds:[si]      ;cl存放具体数据
  72.     jcxz ok1            ;如果数据为00跳出
  73.     mov es:[di],cl      ;数据cl,颜色bl放进显存对应地址
  74.     mov es:[di+1],bl
  75.     inc si
  76.     add di,2
  77.     jmp s

  78.     ok1:
  79.     ret                 ;函数show_str返回

  80. code ends
  81. end begin
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-20 15:58:22 | 显示全部楼层
自问自答,原来debug的时候会自动把dx置为0,而直接运行却不会,就这里出问题导致的死循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 21:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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