鱼C论坛

 找回密码
 立即注册
查看: 5478|回复: 9

[已解决]Debug一步步运行可以,Dos机直接运行却卡死

[复制链接]
发表于 2020-6-3 04:48:28 | 显示全部楼层 |阅读模式

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

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

x
程序实现:就是把12666转换成ASCII码后写入显存显示在屏幕上。

问题:直接在DOS机中输入: 1.exe(假设程序为 1.exe)后,DOS机就不动了;但是如果我输入:debug 1.exe,程序可以正常运行且显示字符12666,也可以用p正常结束.


注:这类问题我看别人也遇到过,想着先搜一搜,但是实在不知道搜什么关键字,所以还是自己发了个贴问一问,麻烦大家了,劳烦提供下相关帖子地址也可以.

  1. assume cs:code

  2. data segment

  3.         db 10 dup (0)
  4.        
  5. data ends

  6. code segment

  7. start:        mov ax,data
  8.                 mov ds,ax

  9.                 mov ax,12666
  10.                 call dtoc
  11.                
  12.                 call allzero
  13.                        
  14.                 call show_str

  15.                 mov ax, 4c00H
  16.                 int 21H

  17. dtoc:
  18.                 mov bx,10 ;设置除数
  19. s:                 div bx ;进行除法
  20.                 mov cx,ax
  21.                 jcxz ok ;若商为0则跳转
  22.                 add dx,30H
  23.                 push dx ;ASCII处理后入栈
  24.                 xor dx,dx ;清零dx
  25.                 inc di ;di记录余数个数
  26.                 jmp short s ;再除

  27. ok:                add dx,30H ;此时商为零,但仍有余数
  28.                 push dx ;入栈最后一位
  29.                 inc di ;确定位数

  30.                 mov cx,di ;把位数设置为循环次数
  31.                 mov si,0 ;清零si
  32. r:          pop ds:[si] ;出栈之前入栈数据到data段
  33.                 add si,2 ;为出栈下个数据做准备
  34.                 loop r
  35.                 ret
  36.                
  37. show_str:
  38.                 mov ax,0B872H
  39.                 mov es,ax ;挂钩显存
  40.                 mov ah,02H ;储存字体颜色
  41.                 mov cx,di;把位数设置为循环次数
  42.                 xor di,di ;清零di
  43.                
  44. x:                mov al,ds:[bx] ;储存对应数字的ASCII码
  45.                 mov es:[di],ax ;写入显存
  46.                 add bx,2
  47.                 add di,2
  48.                 loop x
  49.                 ret
  50.                
  51.                
  52. allzero:
  53.                 mov ax,0
  54.                 mov bx,0
  55.                 mov cx,0
  56.                 mov dx,0
  57.                 mov si,0
  58.                 ret
  59. code ends
  60. end start
复制代码


最佳答案
2020-6-3 15:53:24
可能和保护现场有关,因为DEBUG与实际运行并不一致,建议楼主规范一下代码试试,该有的段都声明好;然后传参用栈传参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-4 07:05:23 | 显示全部楼层
已经解决了,是我在CSDN上找到的帖子,大家可以参考一下!链接:https://bbs.csdn.net/topics/390715980
  我解决的方法就是在代码开始时加了mov ax,0;mov bx,0;mov cx,0;mov dx,0.清空了四个寄存器.DOS机就可以正常运行了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 04:50:24 | 显示全部楼层
代码也有些瑕疵,没有call时push寄存器数据入栈,应该和本帖问题无关吧.大家有好的建议也希望和我说说。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 08:10:03 | 显示全部楼层
这是python吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 09:01:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 12:24:12 | 显示全部楼层
我也不清楚。不过我很奇怪,di自增1之前,你为何不先赋值。di一进去就一定是0吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 13:02:55 | 显示全部楼层
405794672 发表于 2020-6-3 12:24
我也不清楚。不过我很奇怪,di自增1之前,你为何不先赋值。di一进去就一定是0吗?

已经确定过了,刚运行程序时,DX SP BP SI DI的值都为0000哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 15:53:24 | 显示全部楼层    本楼为最佳答案   
可能和保护现场有关,因为DEBUG与实际运行并不一致,建议楼主规范一下代码试试,该有的段都声明好;然后传参用栈传参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-3 20:56:52 | 显示全部楼层
Loser_YiMo 发表于 2020-6-3 13:02
已经确定过了,刚运行程序时,DX SP BP SI DI的值都为0000哦!

你也算是人才了!这次为0下次未必为0。你能保证该程序运行之前,别的程序没有更改di的值 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2021-5-13 21:27:46 | 显示全部楼层
lz,我欠你一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 19:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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