INT中断服务程序
中断服务程序流程图

第一讲:第六章I/O接口原理-接口、端口、编址回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。
重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。
讲授内容:6. 1 输入/输出数据的传输控制方式一、输入/输出的一般概念1.引言输入/输出是微机系统与外部设备进行信息交换的过程。
输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。
因此,CPU与外部设备之间的信息交换技术比较复杂。
CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。
2.输入/输出端口的寻址方式微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。
根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。
方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。
中断和中断处理程序

中断和中断处理程序1. 中断Linux内核要对连接到计算机上的所有硬件设备进⾏管理,⾸先要能和它们互相通信。
从所周知,处理器的速度跟外围硬件设备的速度往往不在⼀个数量级上。
所以,需要⼀种机制,如果轮询(polling)是⼀种解决办法,可以让内核定期对设备的状态进⾏查询,然后做出相应的处理,但这让内核做了不少⽆⽤功。
更好的办法是由我们来提供⼀种机制,让硬件在需要的时候再向内核发出信号。
这就是中断机制。
中断本质上是⼀种特殊的电信号,由硬件设备⽣成,并直接送⼊中断控制器的输⼊引脚上,再由中断控制器向处理器发送相应的信号,处理器⼀经检测到此信号,便中断⾃⼰当前⼯作转⽽处理中断,最后由OS来负责处理新到来的数据。
中断是异步的。
什么是中断?简单地说就是CPU在忙着作⾃⼰的事情,这时候硬件(⽐如说键盘按了⼀下)触发了⼀个电信号,这个信号通过中断线到达中断控制器i8259A,i8259A接受到这个信号后,向CPU发送INT信号申请CPU来执⾏刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU保存当前正在做的事情(REST指令把程序计数器PC中的下⼀条待执⾏的指令的内存地址保存到栈)的情景现场,然后去处理这个申请,根据中断类型号找到它的中断向量(即中断程序在内存中的地址),然后去执⾏这段程序(这段程序已经写好,在内存中),执⾏完后再向i8259A发送⼀个INTA信号表⽰其已经处理完刚才的申请。
此时CPU就可以继续做它刚才被打断做的事情了,将刚才保存的情景现场恢复出来,CPU继续执⾏接下来下⾯的程序。
不同的设备对应的中断不同,⽽每个中断都通过⼀个唯⼀的数字标识。
这些中断值通常被称为中断请求(IRQ)线。
⽐如,IRQ0是时钟中断,⽽IRQ1是键盘中断。
并不是所有的中断号都这样严格定义,像PCI总线上的设备,中断就是动态分配的。
1.1. 异常与中断异常与中断不同,它在产⽣时必须考虑与处理器时钟同步。
实际上,异常也称为同步中断。
关于中断的详细阐述,包括如何写中断服务程序

关于中断的详细阐述,包括如何写中断服务程序关于中断⼀个完整的中断过程由中断请求、中断判优及屏蔽、中断响应、中断处理及中断返回五个部分组成。
在8086/8088微机系统中,中断源的优先权由⾼到低的顺序依次为:除零数、INT n、INT o、NMI(⾮屏蔽中断)、INTR、单步执⾏中断.8259A芯⽚的外部特征:(1)⽚选取信号(CS)(2)写信号(WR)(3)读信号(RD)(4)D0~D7:8条数据总线(5)GND:地信号(6)Vcc:+5V电源(7)INT:中断请求信号(8)中断响应信号(9)IR0~IR7:8个中断请求输⼊信号(10)A0:地址选择信号(11)SP/EN:从⽚编程/允许缓冲器信号(12)CAS0~CAS2:这三条信号是8259A级连时构成8259A的主从式级连结构当CPU完成对8259A的初始化操作后,8259A即进⼊操作状态,通过INT端⼝向CPU提出中断申请,8259A从数据总线D7~D0输出当前服务对象的中断类型号N,CPU截获该中断向量并响应该中断,完成⼀次中断操作。
在IBM PC及其兼容机中,通过CPU的NMI(⾮屏蔽中断)和两个8259A可编程中断控制器芯⽚为系统提供了16级中断,硬件中断结构如图1所⽰1,两⽚8259A构成主从式级联控制结构,与CPU相连的称为主⽚,下⼀层的称为从⽚,从⽚中断请求信号INT与主⽚的IRQ2相连。
IBM PC机中保留给⽤户可随意编程的中断号有IRQ10、IRQ11、IRQ12和IRQ15,这些中断信号都在8259A从⽚上。
IBM PC机中由8259A管理的16级中断均有规定的中断向量存储地址,主⽚中IRQ0-IRQ7分别对应08H-0FH,从⽚中IRQ8-IRQ15分别对应70H-77H(如串⼝1 对应为0CH(12),⽤oldvect=getvect(0x0B)保存原来的中断向量)。
主⽚的中断控制寄存器ICR和中断屏蔽寄存器IMR的⼝地址分别为20H和21H,从⽚的相应寄存器⼝地址分别为A0H和A1H。
中断服务程序举例

8086中断举例一、8086中有个中断向量表,其中有256个中断,每个中断占4个字节,总共1K大小。
二、中断程序的编写主要就是将程序的偏移地址和段地址装载到向量表中。
装载的方法有两种。
方法1:直接装入法。
xorax,ax ; 将AX置零movds,ax;将段初始化为0段,不一定要使用ds段寄存器movax,offset int60 ; 取得中断服务程序的入口地址的偏移量mov ds:[0180h],ax ; 将偏移地址装入中断向量表,60H*4=0180Hmovax,seg int60 ; 取得中断服务程序的入口地址的段地址mov ds:[0180h+2],ax ; 将段地址装入中断向量表8086下的中断服务子程序例程:data segmentinfo db "This is an Interruption service program!",0ah,0dh,'$'data endsSTACK SEGMENT stackSTA DB 50 DUP(?)TOP EQU LENGTH STASTACK ENDScode segmentassumecs:code,ds:data,SS:STACKstart:movax,datamovds,axMOV AX,STACKMOV SS,AXMOV SP,TOPpush ds; ======== 装载中断服务程序的入口地址到中断向量表中========== xorax,axmovds,axmovax,offset printmov ds:[0198h],axmovax,seg printmov ds:[0198h+2],axpop dsint 66h ; 触发中断(软件中断的方式)中断向量号:66H mov ah,4ch ; 返回DOSint 21h; ============= 中断服务程序============ printproc farmovdx,offset info ; 显示一段文字信息mov ah,09hint 21hiret ; 中断返回print endpcode endsend start调试过程需要观察的几个关键点:(1)ISP入口地址装载进中断向量表后的状态(2)在即将触发中断时,CS,IP的变化(3)在中断返回执行IRET时,CS,IP的变化(理解恢复现场)(4)注意堆栈的变化,SP和SS方法2 :push ds; ======== 装载中断服务程序的入口地址到中断向量表中========== mov dx,seg print ; ds:dx(CS:IP)mov ds,dxmov dx,offset printmov al,66h ;中断类型号mov ah,25hint 21h ;装中断向量表pop ds中断向量服务程序入口地址服务程序入口地址中断向量。
中断例程的说明

中断例程的说明
中断例程:INT_LED
利用中断按键INTKEY(接INT5)
当按键动作,在中断服务程序中依次点亮LED灯,并在LCD提示。
键盘中断:
首先是对中断中用到一个结构体的设置, 结构体中各成员变量的意义见结构体的定义, 这一步是在函数ISR_Init()中完成的, 这个函数在ISR.C中, 主要是对中断中用到的寄存器进行初始化, 这些寄存器包括: INTMOD, INTMSK, INTSUBMSK, SRCPND, INTPND。
其次是在主函数中完成对键盘中断服务函数和中断偏移量(INTOFFSET)的关联. 这是在函数Key_init()中完成的, 此函数在KeyBoard.c中. 中断服务函数和中断偏移量(INTOFFSET)的关联是通过函数SetISR_Interrupt(IRQ_EINT5, Key_ISR_5, NULL)来完成的
有了这一步的关联以后当查询到中断偏移量是IRQ_EINT5时就会根据此偏移量调用键盘中断服务函数Key_ISR_5.
有了上面两步的初始化工作以后, 当有键盘按下时就会发生IRQ中断,
过程是先跳转到startup.s中的b IRQ_Handler处, 然后保存寄存器r0-r12, lr跳转到函数ISR_IrqHandler中, 在这个函数中查询中断向量的偏移量, 根据这个偏移量调用相应的中断服务函数.
执行完中断服务函数后再跳转回startup.s中的DMFD sp!, {r0-r12, lr}处,恢复执行中断服务函数之前的状态, 继续执行发生中断服务前的下一条指令.
至此中断过程结束, 在中断服务函数中依次点亮LED灯,并在LCD提示。
.。
第十三章 INT指令-内中断

BIOS中断例程应用(续)
int 10h中断例程:在光标位置显示字符
mov mov mov mov mov int ah,9 ;置光标 al,’a’ bl,7 bh,0 ;第0页 cx,3 10h
BIOS中断例程应用(续)
编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’ assume cs:code code segment mov ah,2 ;置光标 mov bh,0 ;第0页 mov dh,5 mov dl,12 int 10h mov ah,9 mov al,'a' mov bl,0cah mov bh,0 mov cx,3 int 10h mov ax,4c00h int 21h code ends end
程序如下:
assume cs:code code segment start:mov ax,cs mov ds,ax mov si,offset capital mov ax,0 mov es,ax mov di,200h mov cx,offset capitalend - offset capital cld rep movsb ;安装中断程序sqr mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量 mov ax,4c00h int 21h capital: push cx push si change:mov cl,[si] mov ch,0 jcxz ok and byte ptr [si],11011111b inc si jmp short change ok: pop si pop cx iret capitalend: nop code ends end start
中断INT10

INT 10H 是由BIOS 对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在INT 10H 内。
使用INT 10H 中断服务程序时,先指定AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用INT 10H。
底下是它们的说明:13 显示字符串ES:BP = 串地址CX = 串长度DH, DL = 起始行列BH = 页号AL = 0,BL = 属性串:Char,char,……,charAL = 1,BL = 属性串:Char,char,……,charAL = 2串:Char,attr,……,char,attrAL = 3串:Char,attr,……,char,attr光标返回起始位置光标跟随移动光标返回起始位置光标跟随串移动AH=00HAH=00/INT 10H 是用来设定显示模式的服务程序,AL 寄存器表示欲设定的模式:AH=01H您可以把光标想成一个小的矩形,平时这个矩形扁平位于某字底部,但藉由此功能可以改变其大小与位置。
光标起始处与终止处分别由CL 与CH 的0 到4 位表示,参考下图:而CH 的第7 位必须是0,第5、6 位表示光标属性:位 6 位 5 属性0 0 正常0 1 隐形1 01 1 闪烁缓慢AH=02H此功能是设定光标位置,位置用DH、DL 表示,DH 表示列号,DL 表示行号。
由左至右称之为『列』,屏幕最上面一列为第零列,紧靠第零列的下一列称为第一列……;由上而下称之为『行』,屏幕最左边一行称之为第零行,紧靠第零行右边的一行为第一行。
故最左边,最上面的位置为DH=0 且DL=0;最左边第二列,DH=1,DL=0。
如果是文字模式时,BH 为欲改变光标位置的显示页,如果是图形模式,BH 要设为0。
以行列来说明DH、DL 之意义,小木偶常常搞混,底下以座标方式解释。
在文字模式下,字符的位置类似数学直角座标系的座标,但是Y 轴方向相反,Y 轴是以屏幕最上面为零,越下面越大,直到24 为止,存于DH 内。
stc8系列单片机前5个中断源的中断子函数框架

stc8系列单片机前5个中断源的中断子函数框架中断是单片机中一种重要的事件处理机制,能够在系统发生某个指定的事件时,立即打断当前的程序执行,转而执行中断服务程序。
STC8系列单片机提供了多种中断源,本文将介绍其中前5个中断源的中断子函数框架。
一、外部中断0外部中断0是通过INT0引脚触发的中断源。
当INT0引脚的电平发生变化时,可触发外部中断0。
以下是外部中断0的中断子函数框架:```Cvoid INT0_ISR() interrupt 0{// 中断服务程序的代码// ...}```二、外部中断1外部中断1是通过INT1引脚触发的中断源。
当INT1引脚的电平发生变化时,可触发外部中断1。
以下是外部中断1的中断子函数框架:```Cvoid INT1_ISR() interrupt 2{// 中断服务程序的代码// ...}```三、定时器0中断定时器0中断是使用定时器0作为中断源。
定时器0可以设定一个计时周期,当计时器溢出时,会触发定时器0中断。
以下是定时器0中断的中断子函数框架:```Cvoid TIMER0_ISR() interrupt 1{// 中断服务程序的代码// ...}```四、定时器1中断定时器1中断是使用定时器1作为中断源。
定时器1可以设定一个计时周期,当计时器溢出时,会触发定时器1中断。
以下是定时器1中断的中断子函数框架:```Cvoid TIMER1_ISR() interrupt 3{// 中断服务程序的代码// ...}```五、串口中断串口中断是通过串口通信接收和发送数据时触发的中断源。
当接收到数据或发送完成时,可触发串口中断。
以下是串口中断的中断子函数框架:```Cvoid UART_ISR() interrupt 4{// 判断中断类型if (RI){// 接收中断// 中断服务程序的代码// ...}else if (TI){// 发送中断// 中断服务程序的代码// ...}}```总结:以上是STC8系列单片机前5个中断源的中断子函数框架。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mov ax , 4 c00h
2014-05-12
8 / 21
安装程序
我们要做三部分工作:
1 2 3
. 编程实现求平方功能的程序; . 安装程序,我们将其安装在 0:200 处; . 设置中断向量表,将程序的入口地址保存在 7ch 表项中,使其成为 中断 7ch 的中断例程。
..
. ..
. ..
.
loop s 的执行需要两个信息,循环次数和到 s 的位移,所以,7ch 中 断例程要完成 loop 指令的功能,也需要这两个信息作为参数。 我们用 cx 存放循环次数,用 bx 存放位移。 应用举例:在屏幕中间显示 80 个‘ ! ’ 。 认识框架代码。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
17 / 21
问题分析
int 7ch 引发中断过程后,进入 7ch 中断例程,在中断过程中,当前 的标志寄存器、CS 和 IP 都要压栈。 此时压入的 CS 和 IP 中的内容,分别是调用程序的段地址(可以认 为是标号 s 的段地址)和 int 7ch 后一条指令的偏移地址(即标号 se 的偏移地址) 。 可见,在中断例程中,可以从栈里取得标号 s 的段地址和标号 se 的 偏移地址,而用标号 se 的偏移地址加上 bx 中存放的转移位移就可 以得到标号 s 的偏移地址。 可以利用 iret 指令,我们将栈中的 se 的偏移地址加上 bx 中的转移 位移,则栈中的 se 的偏移地址就变为了 s 的偏移地址。 我们再使用 iret 指令,用栈中的内容设置 CS、IP,从而实现转移到 标号 s 处。
1
. 转到标号 s 显然应设 (CS)= 标号 s 的段地址,(IP)= 标号 s 的偏移
地址; . 那么,中断例程如何得到标号 s 的段地址和偏移地址呢? . 现在知道,可以从栈中直接和间接地得到标号 s 的段地址和偏移地 3
2
址,那么如何用它们设置 CS:IP 呢?
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
13 / 21
实例二进一步说明
最后,在中断例程 capital 中用到了寄存器 si 和 cx,编写中断例程和编 写子程序的时候具有同样的问题,就是要避免寄存器的冲突。 应该注意例程中用到的寄存器的值的保存和恢复。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
10 / 21
实例二
实例二编写、安装中断 7ch 的中断例程:
功能:将一个全是字母,以 0 结尾的字符串,转化为大写。 参数:ds:si 指向字符串的首地址。
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
18 / 21
7ch 中断例程
. 7ch 中断例程 . lp : push bp mov bp , s p dec cx jcxz lpret add [ bp +2] , bx l p r e t : pop bp iret .
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
பைடு நூலகம்
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
7 / 21
示例一
assume c s : code code segment start : mov ax , 3 4 5 6 ; ( ax )=3456 i n t 7 ch 据的平方 ax add ax , ax adc dx , dx i n t 21 h code e n d s end s t a r t
. .
INT 中断服务程序
李晓锋
2014-05-12
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
1 / 21
Outline
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
9 / 21
程序解读
注意,在中断例程 sqr 的最后,要使用 iret 指令。 iret 指令的功能 CPU 执行 int 7ch 指令进入中断例程之前,标志寄存器、当前的 CS 和 IP 被压入栈中,在执行完中断例程后,应该用 iret 指令恢复 int 7ch 执行前的标志寄存器和 CS、IP 的值,从而接着执行应用程序。 int 指令和 iret 指令的配合使用与 call 指令和 ret 指令的配合使用具 有相似的思路。
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
4 / 21
Test1.asm 解读
程序是没有做除法,但是在结尾使用了 int 0 指令。 CPU 执行 int 0 指令时,将引发中断过程,执行 0 号中断处理程序, 而系统设置的 0 号中断处理程序的功能是显示“Divide overflow” , 然后返回到系统。 可见,int 指令的最终功能和 call 指令相似,都是调用一段程序。 因此,一般情况下,系统将一些具有一定功能的子程序,以中断处 理程序的方式提供给应用程序调用。 我们在编程的时候,可以用 int 指令调用这些子程序。当然,也可 以自己编写一些中断处理程序供别人使用。 以后,我们可以将中断处理程序简称为中断例程。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
6 / 21
示例一
示例一编写、安装中断 7ch 的中断例程: 功能:求一 word 型数据的平方。 参数:(ax)= 要计算的数据。 返回值:dx、ax 中存放结果的高 16 位和低 16 位。 应用举例:求 2*34562
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
李晓锋
INT 中断服务程序
2014-05-12
5 / 21
编写供应用程序调用的中断例程
前面,我们已经编写过中断 0 的中断例程了,现在我们讨论可以供应用 程序调用的中断例程的编写方法。 我们通过两个实例来讨论: 实例一编写、安装中断 7ch 的中断例程,实现求一 word 型数据的 平方。 实例二编写、安装中断 7ch 的中断例程,实现将一个全是字母,以 0 结尾的字符串,转化为大写。
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
3 / 21
INT 指令的调用
可以在程序中使用 INT 指令调用任何一个中断的中断处理程序。 . test1.asm 示例 . assume c s : code code segment start : mov ax , 0 b800h mov es , ax mov b y t e p t r e s : [ 1 2 * 1 6 0 + 4 0 * 2 ] , ’ ! ’ int 0 code e n d s end s t a r t .
. 1
INT 中断服务程序的编写
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序