那些年,我们一起学过的汇编----之中断

简介:

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

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会先执行那一个中断呢?这就涉及到了中断的优先级问题,这就如同我们所学的高级语言中的符号运算的优先级一样,而对于中断的优先级如下:
 

   1.高------------------------------------------------------>低

   2.内中断(除法出错、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”
   分析:这个程序需要完成设置中断向量的任务,并在中断处理程序中,调用INT  21H显示字符串,为了避免破坏60H号中断向量,首先读取并保存原中断向量,以便测试新的60H号中断及其处理程序后,再恢复原中断向量,下面给出我的相应程序:
 
  1. CODE    SEGMENT

  2. ASSUME  CS:CODE, DS:CODE

  3. MAIN    PROC    FAR

  4. START:  MOV AL, 60H         ;获取原60H中断向量

  5.    MOV AH, 35H

  6. INT 21H          

  7.    PUSH    ES          ;读取的中断向量位于ES:BX中

  8.    PUSH    BX          ;压入堆栈保存

  9.    MOV AX, SEG INT_PROGRAM ;设置新的60H中断向量

  10.    MOV DS, AX          ;中断向量的段地址放在DS中

  11.    MOV DX, OFFSET  INT_PROGRAM ;中断向量的地址放在DX中

  12.    MOV AL, 60H

  13.    MOV AH, 25H         ;用INT  21H的25H号功能设置中断向量

  14. INT 21H

  15. INT 60H         ;用新的60H中断向量

  16.    POP DX          ;把原中断向量弹出堆栈

  17.    POP DS

  18.    MOV AL, 60H

  19.    MOV AH, 25H         ;恢复原中断向量

  20. INT 21H

  21.    MOV AX, 4C00H       ;返回DOS

  22. INT 21H

  23. MAIN    ENDP

  24. DISP    DB  'Yzs'           ;待显示的字符串

  25. INT_PROGRAM PROC    FAR     ;新60H中断处理程序

  26.    PUSH    AX          ;保护现场

  27.    PUSH    BX

  28.    PUSH    CX

  29.    PUSH    DX

  30.    PUSH    SI

  31.    PUSH    DI

  32.    PUSH    BP

  33.    PUSH    DS

  34.    PUSH    ES

  35.    STI         ;开中断

  36.    PUSH    CS      ;设置DS=CS

  37.    POP DS

  38.    MOV DX, OFFSET  DISP

  39.    MOV AH, 09H

  40. INT 21H     ;显示字符

  41.    CLI         ;关中断

  42.    POP ES      ;恢复现场

  43.    POP DS

  44.    POP BP

  45.    POP DI

  46.    POP SI

  47.    POP DX

  48.    POP CX

  49.    POP BX

  50.    POP AX

  51.    IRET

  52. INT_PROGRAM ENDP

  53. CODE    ENDS

  54.    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开始的各单元中。
 
  1. DATA    SEGMENT

  2.    BUF DB  10  DUP  (?)

  3. DATA    ENDS

  4. CODE    SEGMENT

  5. ASSUME  CS:CODE, DS:DATA

  6. START:  MOV AX, DATA

  7.    MOV DS, AX

  8.    LEA BX, BUF

  9.    MOV CX, 10

  10.    STI

  11. NEXT:   PUSH    CX

  12.    MOV AH, 0

  13. INT 1AH

  14.    MOV AL, DL

  15.    CBW

  16.    DIV 5

  17.    MOV [BX], AL

  18.    INC BX

  19.    POP CX

  20.    LOOP    NEXT

  21.    MOV 4CH

  22. INT 21H

  23. CODE    ENDS

  24.    END START

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





     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/941589,如需转载请自行联系原作者

相关文章