中断服务程序,处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为—中断服务程序.
中断处理过程:
(1)保护被中断进程现场.为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值.
(2)分析中断原因,转去执行相应的中断处理程序.在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求.
(3)恢复被中断进程的现场,CPU继续执行原来被中断的进程.
INT后面是中断处理程序,相当于一个双层循环,r7相当于内层循环变量,r6相当于外层循环变量.
首先,r7减一后若不为零就跳转到finish处退出中断,若为零则说明已经完成一个200次的内循环,则将r7恢复成200再看r6,若减一不为零就跳回here处继续一轮内循环,若为零则说明已经完成一个50次的外循环,即已经中断了10000次,则恢复r6为50,迎接下一个10000次中断,并对p1.0状态取反.
80x86 的 0 号中断,是针对“除数为零”而设置的。
如果在程序中,做除法之前加以判断,避免除数为零,
那么,0 号中断,就不会发生了。
那么,再这么认真的学习这块内容,就没有实用意义了。
-------------------------
CPU 执行除法指令,确实是容易发生溢出。
一般来说,当被除数的高位,大于等于除数时,就会发生“溢出”。
如果你编写一个“不会溢出”的除法程序,这些问题,就都没有了。
参考下图:
在右图中,
被除数:1A 2B 3C 4DH,有 32 位数。
除数是:BL,仅有 8 位数。
商,是:32 位数。
按照图中的步骤,需要执行四次 DIV BL。
只要 BL 不为零,就绝对不会发生溢出。
按此思路,被除数的字节数,还可以增加,仅受制于内存的大小。
这就是说:这种除法程序,被除数,可以认为是无限大的。
我们可以用中断类型码,在中断向量表中找到中断处理程序的入口。找到这个入口地址的最终目的是用它设置CS和IP,使CPU执行中断处理程序。用中断类型码找到中断向量,并用它来设置CS和IP,这个工作是由CPU的硬件自动完成的。CPU硬件完成这个工作的过程被称为中断过程。
下面是8086CPU在收到中断信息后,所引发的中断过程。
2)标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中)
3)设置标志寄存器的第8位TF和第9位IF的值为0
4)CS的内容入栈
5)IP的内容入栈;
6)从内存地址为中断类型码 4和中断类型码 4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。
可以简洁的描述如下:
1)取得中断类型码N
2)pushf
3)TF=0,IF=0
4)push CS
5)push IP
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)