《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 解决方案 > 汇编基础:中断

汇编基础:中断

2017-06-10
关键词: 汇编

中断是计算机输入输出程序设计常用的控制方式,有一点计算机操作系统基础的人对这个词一定不会陌生,中断控制技术主要应用在以下几个方面:

1、及时处理计算机中突发故障,比如说突然断电、执行指令时溢出内存故障等等,

2、协调主机与外设工作速度的矛盾

3、在实时控制系统中,及时处理各控制点的现场

一、中断源及中断类型码

引起中断的原因叫做中断源,8086/8088 CPU最多可以处理256种类型的中断,这些中断可来自CPU内部的原因,也可来自外设的I/O请求,根据中断源可将中断分为外部中断和内部中断两大类。

1、外部中断

外部中断是由I/O设备或其他异常情况引起的,这类中断的出现通常是随机的,外部中断又称为硬件中断,外部中断又可分为不可屏蔽中断和可屏蔽中断,一般由外设引起的中断为可屏蔽中断,在标志寄存器中,当IF=1时可屏蔽中断和不可屏蔽中断都能被CPU响应,若IF=0时,不可屏蔽中断能被CPU响应,但屏蔽中断不能够呗CPU响应。中断允许标志位IF的状态可使用STL(使IF=1)和CLI(使IF=0)设置为开中断和关中断。

2、内部中断

由CPU内部引起的中断称为内部中断,比如说除法运算出错、执行软中断指令、单步中断等,它们都是非屏蔽中断,内部中断一般又分为下面四种:

【a】、除法出错中断:当除数为0或处除法中所得商过大时,立即产生一个内部中断。

【b】溢出中断指令INTO:这是一条软件中断指令,当执行该指令时,若前面的运算已产生溢出,是OF=1时,便产生一个内部中断,若OF=0,边不会产生中断。

【c】、软中断指令INT  n:这是系统提供两组功能子程序,一组是ROM的BIOS中,另一组在OS中,这两组功能子程序实现常用的输入输出及文件处理等基本操作,使用软中断指令INT,调用这些功能子程序,以内部中断形式执行这些基本操作。

【d】、单步中断:当标志寄存器中单步标志位TF=1,CPU便进入单步工作方式,即每执行一条指令,就自动产生内部中断,停止执行程序,一共用户检查程序执行结果。

二、中断优先级

当同一时刻有若干个不同的中断请求出现时,CPU会先执行那一个中断呢?这就涉及到了中断的优先级问题,这就如同我们所学的高级语言中的符号运算的优先级一样,而对于中断的优先级如下:

高------------------------------------------------------>低

内中断(除法出错、INT n、INTO)、不可屏蔽中断、可屏蔽中断、单步中断

三、中断过程

中断的过程类似于我们之前所说的子程序调用过程,不同的是在保护中断现场时,除了保存返回地址CS和IP外,还要保存标志寄存器FLAGS的内容,另外当中断响应后CPU自动将IF和TF标志清0,其目的是在CPU进入处理程序后不再响应其他别的中断请求,如果我们还想在执行某一个中断的过程中还可以去执行另外的中断,我们可以通过STI指令将IF标志位置1

一个完整的中断过程有下面5个步骤:1、中断请求2、中断优先级判定3、中断响应4、中断处理5、中断返回。

四、编写自己的中断处理程序

中断处理程序大部分由BIOS或DOS系统提供的,当我们编写自己需要的中断处理程序时,应该注意下面几个问题:

1、程序中不用数据段,一般将数据变量直接放入代码段中

2、程序中不用堆栈段,中断处理程序借用调用者的堆栈段

3、在进入中断处理程序后,首先要保护现场。在程序中用到的寄存器需要压入堆栈保护起来,在程序结束前恢复各寄存器内容,使用时要注意堆栈后进先出的原则

4、在中断处理程序中,若允许中断嵌套,应保护现场后,用STI指令开中断,在中断处理程序的工作结束后,在恢复现场返回之前用CLI指令关中断。

下面我们以一个简单的例子来说明问题

例:编写一个中断处理程序,中断类型号为60H,功能为显示一个字符串“Yzs”

CODE    SEGMENT    
ASSUME  CS:CODE, DS:CODE    
MAIN    PROC    FAR    
START:  MOV AL, 60H         ;获取原60H中断向量    
   MOV AH, 35H    
   INT 21H            
   PUSH    ES          ;读取的中断向量位于ES:BX中    
   PUSH    BX          ;压入堆栈保存    
   MOV AX, SEG INT_PROGRAM ;设置新的60H中断向量    
   MOV DS, AX          ;中断向量的段地址放在DS中    
   MOV DX, OFFSET  INT_PROGRAM ;中断向量的地址放在DX中    
   MOV AL, 60H    
   MOV AH, 25H         ;用INT  21H的25H号功能设置中断向量    
   INT 21H    
   INT 60H         ;用新的60H中断向量    
   POP DX          ;把原中断向量弹出堆栈    
   POP DS    
   MOV AL, 60H    
   MOV AH, 25H         ;恢复原中断向量    
   INT 21H    
   MOV AX, 4C00H       ;返回DOS    
   INT 21H    
MAIN    ENDP    
DISP    DB  'Yzs'           ;待显示的字符串    
       
INT_PROGRAM PROC    FAR     ;新60H中断处理程序    
   PUSH    AX          ;保护现场    
   PUSH    BX    
   PUSH    CX    
   PUSH    DX    
   PUSH    SI    
   PUSH    DI    
   PUSH    BP    
   PUSH    DS    
   PUSH    ES    
   STI         ;开中断    
   PUSH    CS      ;设置DS=CS    
   POP DS    
   MOV DX, OFFSET  DISP    
   MOV AH, 09H    
   INT 21H     ;显示字符    
   CLI         ;关中断    
   POP ES      ;恢复现场    
   POP DS    
   POP BP    
   POP DI    
   POP SI    
   POP DX    
   POP CX    
   POP BX    
   POP AX    
   IRET    
INT_PROGRAM ENDP    
CODE    ENDS    
   END START

五、BIOS和DOS中断调用

我们所说的BIOS就是基本输入输出系统,它存放在内存地址较高地址区域的ROM中,它不仅处理系统的全部中断,还提供对主要I/O接口的控制功能,每个功能的控制模块的入口地址都在中断矢量表中,在1K的中断矢量表中,共有256个中断调用入口地址,对这些中断调用是通过软中断INT来实现的,软中断指令的操作数就是中断类型码。DOS是磁盘操作系统,是由BIOS开机后自动装入内存中的,DOS中断是建立在BIOS之上的中断,它借用了BIOS的软中断功能来调用系统的中断服务程序。

在BIOS中断类型中,0H--9H号中断为硬中断,一般不用程序调用,是由I/O接口触发的。其他中断则是由用户通过指令来控制的。在DOS中断调用中,主要使用21H中断,因为该中断中包括了常用的键盘、磁盘、打印机等一系列I/O接口,在调用时只需将AH寄存器设置成所需要的功能号并设置一些其他所对应的参数即可完成调用功能。因为在平常的编程中一般用得较多的是对硬件依赖不大且代码量比较少的DOS中断调用,所以下面我就侧重介绍下有关DOS中断调用的实例。

1、键盘DOS功能调用

有关键盘方面的INT  21H有1、6、7、8号功能

【a】、1号功能

功能:从键盘读入一个字符,将字符回显在屏幕上,同时将输入的字符送入到AL寄存器中,如果读到的字符是Ctrl+Break键,则结束程序执行

【b】、6号功能

功能:直接读写控制台

输入参数:AH=06H,若DL==00FH表示输入键盘字符, 若DL=0--0FFH,表示输出字符

返回结果:输入时,ZF=0,表示有字符输入,AL为输入字符的ASCII码

ZF=1,表示无字符输入,AL=0

输出时,无返回结果。

【c】、7号功能

功能:从键盘读入一个字符,不回显在屏幕上,同时将输入字符送入到AL寄存器中,也不检测是否为Ctrl+Break键。

【d】、8号功能

功能:1号功能基本相同,只是字符不回显在屏幕上。

2、显示器DOS功能调用

DOS中的INT  21H提供的显示功能主要有以下三个:

【a】、当AH=02H时,功能是显示一个字符,光标跟随字符移动,检测Ctrl+Break键。

输入参数:DL为待显示字符的ASCII码

返回结果:无

【b】、当AH=06H时,功能是显示一个字符,光标跟随字符移动,但不检测Ctrl+Break键。

输入参数:DL为待显示字符的ASCII

返回结果:无

【c】、当AH=09H时,功能是显示字符串,光标跟随字符串移动

输入参数:DS:DX为待显示字符串的首地址,字符串必须以“$”结尾

返回结果:无

我在我的另一篇博文中介绍过过于字符串的输出这部分,是我这个汇编专题的第一篇,有兴趣的朋友可以看下http://yiluohuanghun.blog.51cto.com/3407300/935340

我们再以一个例子结束我们这节关于中断的知识:

例:编程产生10个0--51之间的随机整数,放入内存BUF开始的各单元中。

DATA    SEGMENT    
   BUF DB  10  DUP  (?)    
DATA    ENDS    
CODE    SEGMENT    
ASSUME  CS:CODE, DS:DATA    
START:  MOV AX, DATA    
   MOV DS, AX    
           
   LEA BX, BUF    
   MOV CX, 10    
   STI    
NEXT:   PUSH    CX    
   MOV AH, 0    
   INT 1AH    
   MOV AL, DL    
   CBW    
   DIV 5    
   MOV [BX], AL    
   INC BX    
   POP CX    
   LOOP    NEXT    
   MOV 4CH    
   INT 21H    
CODE    ENDS    
   END START

到此为止,关于中断部分我也大致给大家说完了,当然了,我在这里写的只是这方面的一点点东西,起个抛砖引玉的作用,希望能够对大家有帮助。


本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。