本部分主要是王爽《汇编语言》第12、13、14章的总结概括。
内容为:内中断、int指令和端口。
1.内中断
任何一个通用的CPU,都可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。
这种信息可称为中断信息。
根据信息来自CPU的内部还是外部,中断信息可分为内中断和外中断。
对于8086CPU内中断:
1.中断源产生中断信息,并对应相应的中断类型码:
- 除法错误 0
- 单步执行 1
- 执行into指令 4
- 执行int指令
int n
中的n是中断类型码
2.CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
对于8086PC机,中断向量表指定放在内存地址0处。
其中一个表项占两个字,高地址存放段地址,低地址存放偏移地址。
3.中断过程
(1)从中断信息中取得中断类型码
(2)标志寄存器的值入栈
(3)设置标志寄存器的第8位TF和第9位IF的值为0
(4)CS内容入栈
(5)IP内容入栈
(6)从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置CS和IP
4.执行中断处理程序
中断处理程序的编写方法与子程序比较类似:
(1)保存用到的寄存器
(2)处理中断
(3)恢复用到的寄存器
(4)用iret
指令返回
其中iret
指令功能为:
push IP
push CS
popf
5.关于TF为何设置为0
CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。
为避免在执行中断处理程序时发生中断,陷入死循环,在执行中断程序前将TF设置为0。
6.响应中断的特殊情况
在执行完向ss
寄存器传送数据的指令后,即使是发生中断,CPU也不会响应。
这是为保证设置完ss
寄存器的值,可以接着设置sp
寄存器的值。从而保证ss:sp
指向正确的位置。
我们应该利用这个特性,将设置ss
和sp</