整合:第十二章和十三章 关于内中断
内中断的一些概念
当cpu内部发生一些情况时,会产生一些需要处理的中断信息,会对应有相应的处理
对于8086cpu,有下四种中断情况:
- 除法错误,如div指令产生的除法溢出:中断类型码(下同)0
- 单步执行:1
- 执行into指令:4
- 执行int指令:
int n就是n
中断向量表
8086cpu的向量中断表放在0000:0000 ~ 0000:03ff处,一个表项存一个中断的信息
大概长这样:
每个中断对应的地址共占2个字的大小
高地址字存cs
低地址字存ip
中断过程
- 中断类型码为 n 的中断发生
- 标志寄存器压栈并置 TF=IF=0
- 当前cs 和 ip 压栈(先压cs后ip)
- cs:ip指向中断向量表中n号中断的所指向的地址
- 执行所指地址的中断程序(也叫中断例程)
- *一般中断例程中都有iret指令(作用类似于ret)相当于执行
pop ip,pop cs,popf
自己编写中断例程
- 编写中断例程
- 利用
movsb指令将例程代码送入到合适的内存区(如0000:0200~0000:02ff,中断向量表一般有很多空闲单元,且不会被其他程序占用) - 将 n 号中断里的地址改为上述所选内存的地址
例:编写、安装7ch中断,将data段以0为结尾的字符串转化为大写
ps:中断程序中iret指令的妙用:利用压入在栈中中断发生处的cs:ip可以令iret跳转到想跳转的地方去。
例:在屏幕中间显示80个’!’

Comments