本章实验12,要求编写0号中断的处理程序,使得在除法溢出时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。要实现的效果如下图所示:
在编写这个实验程序之前,我们先复习一下本章的重点内容。
1、中断向量表,指向的是中断程序的地址入口。
2、CUP根据中断类型码,确定中断向量表的表项号,然后根据表项号,找到中断程序的地址入口。
3、中断类型码,主要分为:
1)类型码除法错误:0
2)单步执行:1
3)执行into指令:4
4)执行int指令,格式为 int n,指令中的n为节字型立即数,是提供给CUP的中断
4、中断向量表,位于内存地址0处:从内存0000:0000到0000:3FF
5、中断向量表的表项占2个字:高地址字存放段地址,低地址字存放偏移地址。
6、CUP找到中断程序入口地址,然后将原来的CS和IP值保存
7、CPU设置CS和IP,这个过程称为中断过程。
上述内容如下图所示:
其中,CPU将原来的CS和IP保存这步操作,又分为以下几个步骤:
1、标志寄存器入栈(pushf)
2、设置标志寄志器第8位TF和第9位IF值为0
3、CS内容入栈(push cs)
4、IP内容入栈(push ip)
而中断处理程序的编写方法主要是:
1、保存用到的寄存器
2、处理中断
3、恢复用到的寄存器
4、用iret指令返回。iret指令相当于pop ip、pop cs、popf
需注意的是:
1、CPU在收到中断信息后,会由硬件自动执行中断过程,故在编程中不用涉及包括pushf、push cs、push ip等指令。
2、由于本章实验12只涉及除法溢出产生提示信息,并自动返回DOS界面,未涉及中断返回其他程序的问题,故不用iret指令。
3、编写本章实验12整个程序时,可将其中的中断程序代码传送到0000:0200至0000:02FF的内存区。
4、由于除法溢出中断类型码为0,故中断程序入口地址从0*4地址单元有效,段地址在0*4+2的字单元,偏移地址在0*4字单元
在做这个实验之前,王爽老师给出了一个示例程序12.3,代码如下:
=================================================
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end-offset do0
cld
rep movsb
设置中断向量表
mov ax,4c00h
int 21h