如果。。。 发表于 2012-8-20 11:54:54

Debug窗口一闪而过的解决方法

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

对于我那天发的那个帖子“Debug窗口一闪即逝,有谁和我一样?”的问题,相信有的人的情况可能和我一样,那个问题简要的来说就是这样的:对于一个已经编译好的程序来说,程序的功能主要是往屏幕上输出一段字符或别的什么东西。可是,直接在cmd中运行,你会看到窗口一闪而过,在黑黑的cmd窗口上什么也没留下。只能通过Debug的-g命令直接跳到程序的结尾才能看到要显示的字符出现在屏幕上,很不方便,也麻烦!对于这个问题我也是很是头疼,也发帖问了,很感谢lukelqz网友的热心和耐心的解答。虽然问题没有解决,但还是很感谢你!后来我也不打算弄了,就那样将就着用吧。可在昨晚看书的时候,看到了 13.6节:BIOS中断例程应用。按照书上讲的也动手操作了一下,就是调用BIOS提供的10号中断例程的第9号子程序,功能是在光标位置显示字符。无意间直接在cmd中运行了我编译好的程序,然后竟然在cmd中直接输出了结果,我很是惊讶和兴奋。然后经过我一会的摸索和调试,终于发现了,只要在程序调用中断例程前先调用BIOS的10号中断例程,就可以直接在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:,'!'
            mov byte ptr es:,2 ;颜色属性为绿色
            add di,2
            loop s

            mov ax,4c00h
            int 21h

code ends
end start编译完成后,保存为1.exe。我们直接在cmd中运行下看看效果,效果图如下:
http://ww3.sinaimg.cn/mw690/92c7cb9bgw1dw2zwfxbu8j.jpg
结果发现屏幕上啥也没有,还是黑黑一遍,当然,这里也不是绝对的,有的人的电脑就是可以输出80个绿色的感叹号的,像我们甲鱼老师的就可以,我也不知道为什么他的行,我却不行,呵呵,相信也有大部分人的情况和我一样吧,啥都没看到。不过没关系,我现在已经找到解决的方法了,听我慢慢道来吧。然后,我们将源码改成如下,就是在程序的开始处加上两句,mov ah,9int 10h可能有的人还不知道这两句是干嘛的,不过不要紧,你学到后面就知道了。修改后的源码如下http://ww4.sinaimg.cn/mw690/92c7cb9bgw1dw2zwhyojaj.jpg
为了更易区分,我以图片的形式给出了。好了,修改后我们在编译一下,然后直接在cmd中运行1.exe试试。看:http://ww3.sinaimg.cn/mw690/92c7cb9bgw1dw2zwjgj3pj.jpg呵呵,和我们预期的一样,在屏幕中间输出了80个绿色的感叹号。直接在cmd中运行的哦!好了,这下这个令人蛋疼的问题终于解决了,虽然我也给不出一个令人满意的科学的解释。但知道只要在程序开头出加上    mov ah,9    int 10h就可以了。别问为什么,我也不知道。好了,以后不能正常显示的用户记得在程序前加上这么两句哦!感谢你看到了这里,说了这么多废话,呵呵,谢谢。




lukelqz 发表于 2012-8-20 12:20:28

{:5_108:}顶一个

augustus 发表于 2012-8-20 13:28:35

要是我的话,会在mov ax,4c00h之前加上mov ax,0   ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽然是菜鸟做法)。                           int 16h
                                                               

augustus 发表于 2012-8-20 13:29:49

错位了,:L

如果。。。 发表于 2012-8-20 14:55:21

augustus 发表于 2012-8-20 13:28 static/image/common/back.gif
要是我的话,会在mov ax,4c00h之前加上mov ax,0   ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽 ...

有这种用法吗?我还不知道呢。。。赶紧试试咯。。

如果。。。 发表于 2012-8-20 14:58:51

augustus 发表于 2012-8-20 13:28 static/image/common/back.gif
要是我的话,会在mov ax,4c00h之前加上mov ax,0   ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽 ...

很遗憾,,,在我这上面不行。它根本没有暂停。。。。

augustus 发表于 2012-8-20 17:49:48

如果。。。 发表于 2012-8-20 14:58 static/image/common/back.gif
很遗憾,,,在我这上面不行。它根本没有暂停。。。。

怎没会呢?我试了可以啊。
而且16h号中断0号功能是键盘读取,如果不输入按键是不会跳至下一步的。
还有,可以用循环来等待也可看清输出内容
如利用栈保存cx的值
mov cx,0ffffh
s:push cx
   mov cx,2000h
s2:mov ax,ax
    loop s2
   pop cx
    loop s

pediyzhi 发表于 2012-8-31 19:46:14

    嗯.好贴

pediyzhi 发表于 2012-8-31 19:52:33

刚才试了下.无论是mov ax,0还是 mov ah,9
int 10h
都不行...还是我的方法好啊..呵呵,不过也受教了{:5_108:}
http://bbs.fishc.com/forum.php?mod=viewthread&tid=21575&page=1#pid391418

RAUL 发表于 2012-11-12 22:55:53

这个很给力 !!!!

ycg 发表于 2012-11-30 13:08:05

{:5_106:}顶一个!问题终于解决了

好多鱼^^ 发表于 2013-1-26 23:02:37

Debug窗口一闪而过的解决方法

好多鱼^^ 发表于 2013-1-26 23:10:48

楼主威武!!!!!!!!!!1
页: [1]
查看完整版本: Debug窗口一闪而过的解决方法