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就可以了。别问为什么,我也不知道。好了,以后不能正常显示的用户记得在程序前加上这么两句哦!感谢你看到了这里,说了这么多废话,呵呵,谢谢。
{:5_108:}顶一个 要是我的话,会在mov ax,4c00h之前加上mov ax,0 ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽然是菜鸟做法)。 int 16h
错位了,:L augustus 发表于 2012-8-20 13:28 static/image/common/back.gif
要是我的话,会在mov ax,4c00h之前加上mov ax,0 ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽 ...
有这种用法吗?我还不知道呢。。。赶紧试试咯。。 augustus 发表于 2012-8-20 13:28 static/image/common/back.gif
要是我的话,会在mov ax,4c00h之前加上mov ax,0 ,这样你不按键程序就不会结束了,应该也能看到结果吧(虽 ...
很遗憾,,,在我这上面不行。它根本没有暂停。。。。 如果。。。 发表于 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 嗯.好贴 刚才试了下.无论是mov ax,0还是 mov ah,9
int 10h
都不行...还是我的方法好啊..呵呵,不过也受教了{:5_108:}
http://bbs.fishc.com/forum.php?mod=viewthread&tid=21575&page=1#pid391418 这个很给力 !!!! {:5_106:}顶一个!问题终于解决了 Debug窗口一闪而过的解决方法 楼主威武!!!!!!!!!!1
页:
[1]