一、实验项目要求
基本要求
- 实现子程序和中断服务子程序的设计
- 编写子程序设置40H中断为自定义中断服务子程序
- 编写中断服务子程序实现AX=AX+BX
- 编写主程序调用子程序和中断
扩展要求
- 保留原中断服务子程序功能
- 保留原中断服务并实现原中断服务程序链
思考内容
1.中断向量表结构优缺点
2.中断服务子程序调试方法
二、理论分析或算法分析
1.中断向量表
表的地址位于内存的00000H~003FFH,大小为1KB,用于存放256个中断的中断服务程序的入口地址;每个入口占用4 Bytes,低字为段内偏移,高字为段基址。中断向量表如下图所示:
内部中断服务程序
(1)编写内部中断服务程序与编写子程序类似
利用过程定义伪指令PROC/ENDP结构实现;
最后用IRET指令中断返回;
通常采用寄存器传递参数。
(2)主程序利用INT n指令调用中断服务程序
调用前,需要设置中断向量;
利用INT n指令调用中断服务程序。
中断服务程序的装载方法
将已经编写好的中断服务程序的入口地址写入中断向量表中。
注意:
向量表所在的段地址=0;
若中断类型号为n,则新偏移地址写入4×n处,新段地址写入4×n+2处即可,直接写入法或利用系统功能调用都可实现地址写入
CPU执行INTN指令的过程
CPU取出INT N指令,经指令译码获知这是一条中断指令。N就是该软件中断的中断向量码。执行中断指令,首先自动将PSW、CS和IP压入堆栈保护起来,并关中断。然后,将中断向量码N乘4得到中断向量表偏移地址(段地址为0000H),从该地址开始的顺序两个单元的内容送IP,下两个单元的内容送CS。即找到服务程序入口地址,进而转向中断服务程序。服务结束后通过IRET返回断点继续执行下面的指令。
三、实现方法
取AX=12:
取BX=34:
取AX=AX+BX:
进行第二次相加:
四、实验结果分析
实验结果
取AX=12: 取BX=34: 取AX=AX+BX: 第二次AX=AX+BX:
总结
通过本次实验,我学会了如何定义和调用子程序,可以用中断服务子程序来实现AX=AX+BX,了解了中断向量表的结构。
思考题:
- 中断向量表结构优缺点
优点:根据中断向量表的格式,只要知道了中断类型码力就可以找到所对应的中断向量在表中的位置。中断向量在中断向量表中的存放位置(地址)可由下式计算得到:中断向量在表中的存放地址=n×4
缺点:在80386以后的微机中,由于虚存及保护方式的出现﹐中断向量表不再是固定放在00000H~003FFH区域中(中断向量表的名字也改为中断描述符表IDT),而是可以位于内存的任意区域,表的首地址放在CPU内部的IDT基址寄存器中。每个表项也从4个字节增加到了8个字节,包括2字节的选择器、4字节的偏移量和⒉字节的其他属性。
2.中断服务子程序调试方法
初始化工作方式;接受外设中断请求;中断屏蔽判断;中断判优;中断响应。