实验12 编写0号中断的处理程序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhaixh_89/article/details/101194015

编写0号中断处理程序,使得在除法溢出时,在屏幕中间显示字符串'divide error!',然后返回dos。

前面讲到,内存0000:0000~0000:03FF,大小为1KB的空间是系统存放中断处理程序入口地址的中断向量表。8086支持256个中断,但是,实际上,系统要处理的中断事件远没有达到256个,所以在向量列表中,有许多单元是空的。

中断向量表睡觉哦PC系统中最重要的内存区,只用来存放中断处理程序的入口地址,DOS系统和其他应用程序都不会随便使用这段空间。可以利用中断向量表中的空闲单元来存放我们的程序,一般情况下,从0000:0200~0000:02FF的256个字节的空间所对应的中断向列表项都是空的,操作系统和其他应用都不会占用。

根据本章内容的学习编写不难编写该实验,按照文中所述我们编写一个do0程序作为0号中断的中断处理程序,即我们需要将中断处理程序do0放到000:0200后。若要是的除法溢出的时候,cpu转去执行do0,则必须将do0的入口地址,及0000:02;;登记在中断向量表的对应表项中,因为除法溢出对应的中断类型码为0,他的中断处理程序的入口地址应该从0*4地质单元开始存放,段地址存放在0*4+2字单元中,偏移地址存放在0*4字单元中,也就说要将do0的段地址0存放在0000:0002字单元中,将偏移地址200H存放在0000:0000字单元中,总结以上分析,需要做以下几件事情

(1)编写可以显示divide error!的中断处理程序:do0;

(2)将do0送入内存0000:0200处;

(3)将do0的入口地址0000:0200存储在中断向量表0号表项中

程序源码如下:

assume cs:code

code segment
	    begin:mov ax, cs
		  mov ds, ax
		  mov si, offset do0
		  
		  mov ax, 0
		  mov es, ax
		  mov di, 200h
		  ;将中断处理程序送入0:200地址处
		  mov cx, offset do0end - offset do0
		  cld
		  rep movsb
		  
		  ;设置中断向量表
		  mov ax, 0
		  mov es, ax
		  mov word ptr es:[0*4], 200h
		  mov word ptr es:[0*4+2], 0
		  
		  ;测试程序
		  mov ax, 1000h
		  mov bh, 1
		  div bh
		  
		  mov ax, 4c00h
		  int 21h
		  
	;显示中断处理overflow
	   do0:jmp short do0start
	       db "divide error!"
          do0start:mov ax, cs
		   mov ds, ax
		   mov si, 202h
		   
		   mov ax, 0b800h
		   mov es, ax
		   mov di, 12*160+72
		   
		   mov cx, 13
		 s:mov al, [si]
		   mov es:[di], al
		   inc si
		   add di, 2
		   loop s
		   
		   mov ax, 4c00h
		   int 21h
   do0end: nop
code ends

end begin

程序未执行前0000:0200-0000:02FF处的内容为

执行后,结果显示为

内存0000:0200~0000:02FF处存放了我们编写的0号中断的中断处理程序,如下图

猜你喜欢

转载自blog.csdn.net/zhaixh_89/article/details/101194015
今日推荐