. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->内中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  中段的不解  [待解决] 回复[ 3次 ]   点击[ 827次 ]  
396448534
[帖 主]   [ 发表时间:2009-02-05 14:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-18 13:31
书本上实验13(1)中:编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。


程序如下:assume cs:code

data segment
        db "welcome to masm!",0
data ends

code segment

start:
        mov ax,cs
        mov ds,ax
        mov si,offset no7c
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset no7cend-offset no7c
        cld
        rep movsb                        ;此安装int 7c中断例程

         mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4+2],0      ;设置中断向量的新地址

 

        mov dh,10       ;行号
        mov dl,10       ;列号
        mov cl,2        ;颜色属性
        
        mov ax,data
       mov ds,ax
       mov si,0
       
       int 7ch         ;调用中断例程

 

        mov ax,4c00h
       int 21h


no7c:   push ax       ;定义中断例程[开始]
        push bx
        push di
        mov bx,0b800h
        mov es,bx

        mov al,160d
        mul dh
        mov di,ax
        mov al,2        ;此确定显存的偏移地址,
         mul dl          
         add di,ax

        mov bl,cl

again:  mov cx,[si]
        jcxz no7cret
        mov es:[di],cl
        mov es:[di+1],bl
        inc si
        add di,2
        jmp short again

no7cret: pop di
         pop bx
         pop ax

         iret

no7cend: nop                ;定义中断例程[结束]

code ends

end start

问题一:
0000:0000-0000:03F0是中断向量表的保存地址,从0000:0200-0000:02FF一般是空的,
在程序中将int 7Ch中断的入口地址改变,这个改变是不是会随程序的运行结束而被释放??
我想不会被释放,这个word ptr es:[7ch*4]和word ptr es:[7ch*4+2]的内容会被保留,除非关机重启才被重置为原来的地址。而我在实验中发现程序运行完后关闭,去查看word ptr es:[7ch*4]和word ptr es:[7ch*4+2]的内容居然是空的,没保留0002 0000 。我也将mov ax,0
                                               mov es,ax
                                               mov word ptr es:[7ch*4],200h
                                               mov word ptr es:[7ch*4+2],这些屏蔽,结果内存出错了,我真的很纳闷,系统能释放中断表地址的内容??那这样不就乱了套么??只有你在单步跟踪到mov word ptr es:[7ch*4],200h
                            mov word ptr es:[7ch*4+2],0
时word ptr es:[7ch*4]和word ptr es:[7ch*4+2]的内容才是0002 0000 ,这也没什么奇怪的,为什么系统不会保存这0002 0000 呢??如果你运行一次这程序,这0002 0000应该是保存在系统的,只要你不关机,随时在DEBUG查看word ptr es:[7ch*4]和word ptr es:[7ch*4+2]的内容都应该是0002 0000呀。

问题二:
复制到0000:0200的是no7c和no7cend之间的代码还是代码产生的结果??
我想应该是代码,我用U 0000:0200看到的也是no7c和no7cend之间的代码,既然是代码,而且0000:0200是中断向量表的存储地方,也就是不能被随意释放,也就是跟为题一一样,这代码应该不会被释放,我还是将no7c和no7cend之间的代码屏蔽,也出错了.在程序运行一遍后,在看U 0000:0200 ,里面的内容居然不是no7c和no7cend之间的代码。为什么??
    
我认为7CH的地址保存的和0000:0200保存的数据是不会像其他内存的数据一样运行完被系统释放的,结果我错,但我不知道我为什么错!!难道系统也释放0000:0000-0000:03FF的数据?不大可能呀....

请高手指点......
abob
[第1楼]   [ 回复时间:2009-02-06 10:44 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
问题一: 
0000:0000-0000:03F0是中断向量表的保存地址,从0000:0200-0000:02FF一般是空的,
在程序中将int 7Ch中断的入口地址改变,这个改变是不是会随程序的运行结束而被释放?? 
我想不会被释放,
--------------
是不会被释放的,除非有其他程序使用了这块内存或是重启了系统。这里的重启系统有两个,一个是真实的重启了你的电脑,二是运行这个程序的“操作系统”重启了,比如书上介绍编译运行此程序的虚拟dos(附注一)。如果你运行完程序关闭了dos窗口,打开另外一个debug,会发现0:200H的内容仍是空的,因为这样相当于重新启动了一个dos系统。

问题二: 
复制到0000:0200的是no7c和no7cend之间的代码还是代码产生的结果?? 
我想应该是代码,
-------------
和问题一一样,不过这句话读着很绕口啊;) 

运行/command/程序目录 运行 debug查看,发现不论是中断向量表对应的数据,还是0:200H的数据仍然都存在。
mess
[第2楼]   [ 回复时间:2009-02-07 16:42 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
楼主调试过程有问题,程序运行完不论中断向量表还是0:200H都不会自动改变的。
396448534
[第3楼]   [ 回复时间:2009-02-17 18:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-18 13:31
感谢abod的回答

回答如下:
说的运行/command/程序目录 运行/command/程序目录 
----------- 
不好意思,没说太清楚。程序目录就是你要运行的程序所在的目录。 
我都意思是按照第四章实验三的内容运行程序,不要用其他的集成环境等。

不应该说是“0000:0200的内容有保存”,而是你的程序执行完后,计算机没有其他的程序使用这块内存,进而可能去覆盖它。所以他们的数据能保持你中断时候安装的程序代码,还包括中断向量表的你更改的数据。“保存”这部分的内容是你安装中断的时候做的。 

就跟栈使用内容一样,虽然执行了pop,但是并不是说执行了pop后原数据就被擦掉了,这个数据仍然保存在栈中,只要没有被覆盖就一直存在。(这个也就是我比较喜欢的一句话:学习在知识之内也在知识之外,这个pop问题和楼主遇到的问题是相通的) 

但是计算机重启这个内容中的数据就自然消失了,比如你按照书上说的在虚拟dos下运行,你关闭它在打开或重新打开一个虚拟dos程序,就等于是重新启动了此虚拟dos系统了。 

所以根据你发的帖子看,是不调试步骤有问题,很可能是重新打开了虚拟dos,或使用了一些集成环境(集成环境也是一个程序,它可能对debug等进行了包装使一些错误提示信息等不明确甚至集成环境还存在bug)。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved