Debug一步步运行可以,Dos机直接运行却卡死
程序实现:就是把12666转换成ASCII码后写入显存显示在屏幕上。问题:直接在DOS机中输入: 1.exe(假设程序为 1.exe)后,DOS机就不动了;但是如果我输入:debug 1.exe,程序可以正常运行且显示字符12666,也可以用p正常结束.
注:这类问题我看别人也遇到过,想着先搜一搜,但是实在不知道搜什么关键字,所以还是自己发了个贴问一问,麻烦大家了,劳烦提供下相关帖子地址也可以.
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,12666
call dtoc
call allzero
call show_str
mov ax, 4c00H
int 21H
dtoc:
mov bx,10 ;设置除数
s: div bx ;进行除法
mov cx,ax
jcxz ok ;若商为0则跳转
add dx,30H
push dx ;ASCII处理后入栈
xor dx,dx ;清零dx
inc di ;di记录余数个数
jmp short s ;再除
ok: add dx,30H ;此时商为零,但仍有余数
push dx ;入栈最后一位
inc di ;确定位数
mov cx,di ;把位数设置为循环次数
mov si,0 ;清零si
r: pop ds: ;出栈之前入栈数据到data段
add si,2 ;为出栈下个数据做准备
loop r
ret
show_str:
mov ax,0B872H
mov es,ax ;挂钩显存
mov ah,02H ;储存字体颜色
mov cx,di;把位数设置为循环次数
xor di,di ;清零di
x: mov al,ds: ;储存对应数字的ASCII码
mov es:,ax ;写入显存
add bx,2
add di,2
loop x
ret
allzero:
mov ax,0
mov bx,0
mov cx,0
mov dx,0
mov si,0
ret
code ends
end start
已经解决了,是我在CSDN上找到的帖子,大家可以参考一下!链接:https://bbs.csdn.net/topics/390715980
我解决的方法就是在代码开始时加了mov ax,0;mov bx,0;mov cx,0;mov dx,0.清空了四个寄存器.DOS机就可以正常运行了! 代码也有些瑕疵,没有call时push寄存器数据入栈,应该和本帖问题无关吧.大家有好的建议也希望和我说说。 这是python吗 小甲鱼的铁粉 发表于 2020-6-3 08:10
这是python吗
汇编 我也不清楚。不过我很奇怪,di自增1之前,你为何不先赋值。di一进去就一定是0吗? 405794672 发表于 2020-6-3 12:24
我也不清楚。不过我很奇怪,di自增1之前,你为何不先赋值。di一进去就一定是0吗?
已经确定过了,刚运行程序时,DX SP BP SI DI的值都为0000哦! 可能和保护现场有关,因为DEBUG与实际运行并不一致,建议楼主规范一下代码试试,该有的段都声明好;然后传参用栈传参 Loser_YiMo 发表于 2020-6-3 13:02
已经确定过了,刚运行程序时,DX SP BP SI DI的值都为0000哦!
你也算是人才了!这次为0下次未必为0。你能保证该程序运行之前,别的程序没有更改di的值 ? lz,我欠你一个
页:
[1]