8086汇编 中断
8086汇编 中断
中断:CPU不再接着(刚执行完的指令)向下执行,而是转去处理中断信息。
- 内中断:由CPU内部发生的事件而引起的中断
- 外中断:由外部设备发生的事件引起的中断
8086的内中断
CPU内部产生的中断
- 除法错误,比如:执行div指令产生的除法溢出
- 单步执行
- 执行into指令
- 执行int 指令
8086的中断类型码
- (1)除法错误:0
- (2)单步执行:1
- (3)执行 into 指令:4
- (4)执行 int n指令 ,立即数 n 为中断类型码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
中断过程
中断过程由CPU的硬件自动完成;
用中断类型码找到中断向量,并用它设置CS和IP
8086CPU的中断过程
(1)从中断信息中取得中断类型码
(2)标志寄存器的值入栈——中断过程中要改变标志寄存器的值,需要先行保护
(3)设置标志寄存器的第8位TF 和第9位IF的值为0
(4)CS的内容入栈;
(5)IP的内容入栈;
(6)从中断向量表读取中断处理程序的入口地址,设置IP和CS。
编制中断处理程序
(1)取得中断类型码N;
(2) pushf
(3) TF = 0,IF = 0
TF(Trap Flag): 陷阱标志,用于单步调试;
IF(Interrupt Flag):中断标志;
(4) push CS
(5) push IP
(6)(IP) = (N*4),(CS) = (N*4+2)
CPU随时都可能检测到中断信息,所以中断处理程序必须常驻内存(一直存储在内存某段空间之中)。
中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中(0000:0000-0000:03FF)。
单步中断
两个和中断相关的寄存器标志位
TF-陷阱标志(Trap flag):用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。
IF-中断标志(Interrupt flag):当IF=1时,允许CPU响应可屏蔽中断请求;当IF=0时,关闭中断。
CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断(中断类型码为1),引发中断过程,执行中断处理程序。
中断过程
(1)取得中断类型码1;
(2)标志寄存器入栈,TF、IF设置为0;
(3) CS、IP入栈;
(4)(IP)=(1*4),(CS)=(1*4+2)。
• 中断处理程序也由一条条指令组成的。
• 如果在执行中断处理程序之前,TF=1,则CPU在执行完中断处理程序的第一条指令后,又要产生单步中断,转去执行单步中断的中断处理程序的第一条指令……
• 上面的过程将陷入一个永远不能结束的循环,CPU永远执行单步中断处理程序的第一条指令。
• 所以,在进入中断处理程序之前,设置TF=0。
应用:中断不响应的情况
一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。
在有些情况下,CPU 在执行完当前指令后,即便是发生中断,也不会响应。
例:在执行完向 ss寄存器传送数据的指令后,即便是发生中断,CPU 也不会响应。
原因:ss:sp联合指向栈顶,而对它们的设置应该连续完成。
以此保证对栈的正确操作!
注:栈段 与 栈顶指针 必须连续起来去做。
由int指令引发的中断
int n引起的中断
- CPU内部产生的中断信息
- 除法错误
- 单步执行
- 执行into指令
- 执行int 指令
int格式: int n,n为中断类型码
功能:引发中断过程
CPU 执行int n指令,相当于引发一个 n号中断的中断过程,执行过程如下:
(1)取中断类型码n;
(2)标志寄存器入栈,IF = 0,TF = 0;
(3)CS、IP入栈;
(4)(IP) = (n*4),(CS) = (n*4+2)。 —从此处转去执行n号中断的中断处理程序。
• int 指令的最终功能和call指令相似,都是调用一段程序。
• 一般情况下,系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。
BIOS和DOS中断处理
BIOS,是在系统板的ROM中存放着一套程序
- 容量:8KB
- 地址:从FE000H开始
BIOS中的主要内容
(1)硬件系统的检测和初始化程序
(2)外部中断和内部中断的中断例程
(3)用于对硬件设备进行I/O操作的中断例程
(4)其他和硬件系统相关的中断例程
使用BIOS功能调用,程序员不用了解硬件操作细节,直接使用指令设置参数,并中断调用BIOS例
程,即可完成相关工作!
使用BIOS功能调用:(1)方便编程;(2)能写出简洁、可读性好、易于移植的程序。
一、在屏幕的5行12列显示3个红底高亮闪烁绿色的'a'
用BIOS的10h中断
(ah)=2时,调用第10h中断例程的2号子程序,设置光标位置
(ah)=9时,调用第10h中断例程的9号子程序,在光标位置显示字符
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
assume cs:code code segment mov ah,2 ;置光标功能 mov bh,0 ;第0页 mov dh,5 ;dh中放行号 mov dl,12 ;dl中放列号 int 10h mov ah,9 ;显示字符功能 mov al,'a' ;字符 mov bl,11001010b;颜色属性 mov bh,0 ;第0页 mov cx,3 ;字符重复个数 int 10h mov ax,4c00h int 21h code ends end