内中断的4种情况:
中断原因 | 中断类型码 |
---|---|
除法错误 | 0 |
单步执行 | 1 |
执行 into 指令 | 4 |
执行 int 指令,格式为int n | n |
中断向量表: 是中断向量的列表.
中断向量: 是中断程序的入口地址.
对于 8086PC 机, 中断向量表存放在 0000:0000 ~ 0000:03FF 所在的内存中,共1000个单元.
每个表项占用两个字节的大小. 高地址字存放段地址, 低地址字存放偏移地址.
收到中断信息后,引发如下中断过程:
注意如果用自己的代码来替换系统提供的中断指令,第6步时设置自己的代码的入口,
完成后才开始执行自己的代码/中断指令代码,即前5步都和自己的代码/中断指令代码无关。
- 从中断信息中获取中断类型码
- 标志寄存器的值入栈(因为中断过程会改变标志寄存器的值,所以预先保存一份)
- 设置标志寄存器的第8位TF和第9位IF的值为 0.
- CS 的内容入栈
- IP 的内容入栈
- 从内存地址为中断类型码x4和中断类型码x4+2的两个单元中读取中断处理程序的入口地址放入IP和CS中
简洁的写法:
- 获取中断类型码N
- pushf
- TF=0,IF=0
- push CS
- push IP
- (IP)=(Nx4),(CS)=(Nx4+2)
最后一步完成后,CPU开始执行中断处理程序。
iret的操作:
- pop IP
- pop CS
- popf
用自己的代码取代系统的指定指令时,依旧用iret返回即可。