鱼C论坛

 找回密码
 立即注册
查看: 3386|回复: 12

[技术交流] Debug窗口一闪而过的解决方法

[复制链接]
发表于 2012-8-20 11:54:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 如果。。。 于 2012-8-20 12:03 编辑

对于我那天发的那个帖子“Debug窗口一闪即逝,有谁和我一样?”的问题,相信有的人的情况可能和我一样,
那个问题简要的来说就是这样的:对于一个已经编译好的程序来说,程序的功能主要是往屏幕上输出一段字符或别的什么东西。可是,直接在cmd中运行,你会看到窗口一闪而过,在黑黑的cmd窗口上什么也没留下。只能通过Debug-g命令直接跳到程序的结尾才能看到要显示的字符出现在屏幕上,很不方便,也麻烦!
对于这个问题我也是很是头疼,也发帖问了,很感谢lukelqz网友的热心和耐心的解答。虽然问题没有解决,但还是很感谢你!后来我也不打算弄了,就那样将就着用吧。
可在昨晚看书的时候,看到了 13.6节:BIOS中断例程应用。按照书上讲的也动手操作了一下,就是调用BIOS提供的10号中断例程的第9号子程序,功能是在光标位置显示字符。
无意间直接在cmd中运行了我编译好的程序,然后竟然在cmd中直接输出了结果,我很是惊讶和兴奋。
然后经过我一会的摸索和调试,终于发现了,只要在程序调用中断例程前先调用BIOS10号中断例程,就可以直接在cmd中运行和显示结果了。当然,为了方便,我直接将10号中断例程直接在程序开头处就调用了。
说了这么多,大家可能听的云里雾里的,下面我们用一个实例来说明一下吧。
比如下面这个程序,功能是往屏幕中间输出80个“!”。
源码如下:
assume cs:code         code segment start: 
            mov ax,0b800h                ;显存的段地址
            mov es,ax
            mov di,160*12                ;屏幕的第12行
  
   s:       mov cx,80                       ;循环80次s: mov byte ptr es:[di],'!'
            mov byte ptr es:[di+1],2 ;颜色属性为绿色
            add di,2
            loop s
  
            mov ax,4c00h
            int 21h
  
code ends
end start
编译完成后,保存为1.exe。我们直接在cmd中运行下看看效果,效果图如下:


                               
登录/注册后可看大图

结果发现屏幕上啥也没有,还是黑黑一遍,当然,这里也不是绝对的,有的人的电脑就是可以输出80个绿色的感叹号的,像我们甲鱼老师的就可以,我也不知道为什么他的行,我却不行,呵呵,相信也有大部分人的情况和我一样吧,啥都没看到。不过没关系,我现在已经找到解决的方法了,听我慢慢道来吧。
然后,我们将源码改成如下,就是在程序的开始处加上两句,
mov ah,9
int 10h
可能有的人还不知道这两句是干嘛的,不过不要紧,你学到后面就知道了。修改后的源码如下

                               
登录/注册后可看大图

为了更易区分,我以图片的形式给出了。
好了,修改后我们在编译一下,然后直接在cmd中运行1.exe试试。看:

                               
登录/注册后可看大图
呵呵,和我们预期的一样,在屏幕中间输出了80个绿色的感叹号。直接在cmd中运行的哦!
好了,这下这个令人蛋疼的问题终于解决了,虽然我也给不出一个令人满意的科学的解释。但知道只要在程序开头出加上  
    mov ah,9
    int 10h
就可以了。别问为什么,我也不知道。好了,以后不能正常显示的用户记得在程序前加上这么两句哦!感谢你看到了这里,说了这么多废话,呵呵,谢谢。





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-20 12:20:28 | 显示全部楼层
顶一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-20 13:28:35 | 显示全部楼层
要是我的话,会在mov ax,4c00h之前加上mov ax,0   ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽然是菜鸟做法)。                             int 16h
                                                               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-20 13:29:49 | 显示全部楼层
错位了,:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-20 14:55:21 | 显示全部楼层
augustus 发表于 2012-8-20 13:28
要是我的话,会在mov ax,4c00h之前加上mov ax,0   ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽 ...

有这种用法吗?我还不知道呢。。。赶紧试试咯。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-20 14:58:51 | 显示全部楼层
augustus 发表于 2012-8-20 13:28
要是我的话,会在mov ax,4c00h之前加上mov ax,0   ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽 ...

很遗憾,,,在我这上面不行。它根本没有暂停。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-20 17:49:48 | 显示全部楼层
如果。。。 发表于 2012-8-20 14:58
很遗憾,,,在我这上面不行。它根本没有暂停。。。。

怎没会呢?我试了可以啊。
而且16h号中断0号功能是键盘读取,如果不输入按键是不会跳至下一步的。
还有,可以用循环来等待也可看清输出内容
如利用栈保存cx的值
  mov cx,0ffffh
s:push cx
   mov cx,2000h
s2:mov ax,ax
    loop s2
   pop cx
    loop s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-31 19:46:14 | 显示全部楼层
    嗯.好贴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-31 19:52:33 | 显示全部楼层
刚才试了下.无论是mov ax,0还是 mov ah,9
int 10h
都不行...还是我的方法好啊..呵呵,不过也受教了
http://bbs.fishc.com/forum.php?m ... mp;page=1#pid391418
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-12 22:55:53 | 显示全部楼层
这个很给力 !!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-30 13:08:05 | 显示全部楼层
顶一个!问题终于解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-26 23:02:37 | 显示全部楼层
Debug窗口一闪而过的解决方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-26 23:10:48 | 显示全部楼层
楼主威武!!!!!!!!!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-7 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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