最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。
依据中断来源,中断可以分为内部中断,和外部中断。
1.内部中断的产生
当CPU发生下列事情后,会产生中断:
(1)除法错误,中断号:0
(2)单步执行,中断号:1
(3)执行info指令,中断号:4
(4)执行int指令,中断号:int 指令后面跟随的立即数
CPU收到中断信息后,需要立即对中断进行处理,处理中断的程序叫中断处理程序。CPU用8位的中断码通过中断向量表找到相应的中断处理程序,中断向量就是中断处理程序入口地址。
中断向量表:
0号中断对应的中断处理程序的入口地址
1号中断对应的中断处理程序的入口地址
......
n号中断对应的中断处理程序的入口地址
这样,CPU通过中断号就能找到中断处理程序的入口地址。中断向量表在内存中存放,对于8086处理器,中断向量表指定放在内存地址0处,从0000:0000到0000:03FF的1024个地址单元中,不同CPU可能有不同的约定。
CPU响应中断的方式是:设置CS:IP的值,使他指向中断处理程序入口地址。
中断过程:
(1)(从中断信息中心)取得中断号
(2)标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先保存当前值在栈中)
(3)设置标志寄存器的第8位TF和第9位IF的值为0
(4)CS的内容入栈(保存中断现场,以备恢复)
(5)IP的内容入栈(保存中断现场,以备恢复)
(6)从内存地址为中段号4和中断号4+2的两字单元中读取中断处理程序的入口地址设置IP和CS。
(7)CPU开始执行程序员编写的中断处理程序
中断处理程序
(1)保存用到的寄存器
(2)处理中断
(3)恢复用到的寄存器
(4)用iret指令返回,CPU将回到中断前的程序继续执行
2.BIOS和DOS所提供的中断例程
在系统板的ROM中存放着一套程序,成为BIOS程序,由以下部分组成:
(1)硬件系统的检测和初始化程序
(2)外部中断和内部中断的中断例程
(3)用于对硬件设备进行IO操作的中断例程
(4)其他和硬件系统相关的中断例程
DOS操作系统也提供了中断例程,从操作系统角度看,DOS的中断例程就是操作系统向程序员提供的编程资源。
可以用int指令直接调用BIOS和DOS提供的中断例程。
载入BIOS中断例程和DOS中断例程的过程:
(1)开机后,CPU加电,初始化CS、IP,自动从CS:IP处执行程序,jmp到bios中的硬件检查和初始化程序。
(2)初始化程序建立BIOS所支持的中断向量,将BIOS所支持的中断例程注册到中断向量表中。
(3)硬件初始化完成后,执行:int 19h,进行操作系统引导,从此将计算机转交给操作系统。
(4)DOS启动后,将他所提供的中断例程装入内存,注册到中断向量表中。
来源:51CTO
作者:Lee_1985
链接:https://blog.51cto.com/14207158/2473569