|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
程序实现:就是把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:[si] ;出栈之前入栈数据到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:[bx] ;储存对应数字的ASCII码
- mov es:[di],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
复制代码
可能和保护现场有关,因为DEBUG与实际运行并不一致,建议楼主规范一下代码试试,该有的段都声明好;然后传参用栈传参
|
|