书本上实验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的数据?不大可能呀....
请高手指点...... |