【笔记】【汇编语言】第12章 内中断

12.0 概述
  任何一个通用的CPU,都具备处理中断信息的能力.中断的意思是指:CPU不再接着(刚执行完的指令)向下执行,而是转去处理"中断"这个特殊信息.
  中断信息可以来自CPU的内部和外部,本章主要讨论内中断.
 
12.1 内中断的产生
  对于8086CPU,当CPU内部有下面情况发生的时候,将产生相应的中断信息:
  (1) 除法错误,比如执行div指令产生的除法溢出
  (2) 单步执行
  (3) 执行into指令
  (4) 执行int指令
 
  8086CPU使用>>中断类型码<<来标识这四种不同的中断信息来源(简称中断源),中断类型码有一个字节(可表示256种类型),上述四种中断源的类型码如下:
  (1) 除法错误:0
  (2) 单步执行:1
  (3) 执行into指令:4
  (4) 执行int n指令:n
 
12.2 中断处理程序
  CPU收到中断信息后,需要对中断信息进行处理,不会调用中断处理程序.可以由我们自己编写,一般来讲对不同的中断信息需要不同的中断处理程序.
  CPU需要在中断信息和中断处理程序入口地址之间建立联系,中断类型码的作用就是用来定位中断处理程序的.
 
12.3 中断向量表
  中断向量,指中断处理程序的入口地址.中断向量表,就是一个中断向量的列表,也就是中断程序入口地址的列表.
  CPU通过8位的中断类型码在中断向量表中找到中断处理程序的入口地址.
  中断向量表在内存中存放,对于8086PC机,指定存放在内存地址0处,0000:0000到0000:03FF的1024个单元中存放着中断向量表.
  对于8086CPU,一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址.
 
12.4 中断过程
  用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的,CPU完成这个工作的过程叫中断过程.
  下面是8086CPU收到中断信息后,所引发的中断过程:
  (1) 取得中断类型码N
  (2) pushf
  (3) TF=0,IF=0
  (4) push CS
  (5) push IP
  (6) (IP)=N*4,(CS)=(N*4+2)
 
12.5 中断处理程序和iret指令
  由于CPU可能随时检测到中断信息,也就是说随时可能执行中断处理程序,所以中断处理程序发布一直存储在内存某段空间中,而中断向量必须一直存在对应的中断向量表表项中.
  中断处理程序的编写方法和子程序比较相似,常规步骤如下:
  (10 保存要用到的寄存器
  (2) 处理中断
  (3) 恢复用到的寄存器
  (4) 用iret指令返回,iret指令的功能可以用汇编语法描述为:
    pop IP
    pop CS
    popf
  iret指令执行后,CPU顺到执行中断处理程序前的执行点继续执行程序.
 
12.6 除法错误中断的处理(0号中断)
  显示提示信息"Divide Overflow",然后返回操作系统
 
12.7 编程处理0号中断
  我们需要做的事情:
  (1) 编写可以显示"Overflow"的中断处理程序:假设为do0
  (2) 将do0送入内存0000:0200处
  (3) 将do0的入口地址0000:0200存储在中断向量表0号表项中
  回忆一下,我们通过改变SS,SP,来使一段内存单元变成栈顶,通过改变CS,IP来使一段内存单元被CPU执行,同样,我们通过改写中断向量表,来使一段内存成为中断处理程序.
 
12.8 安装
  将do0代码传送到0:200处,并设置中断向量表.
  <> 可以利用编译器计算一段代码的长度,如: offset 标号2- offset 标号1 (编译器可识别表达式)
 
12.9 do0的编写
  注:do0要显示的字符串"overflow!"也应该放在一段不会被覆盖的空间中.所以可在do0程序里定义这个字符串数据.
 
12.10 设置中断向量
  0号表项的地址为0:0,其中0:0字单元存放偏移地址,0:2字单元存放段地址.
 
12.11 单步中断
  CPU在执行完一条指令后,如果检测到标志寄存器TF标志为1,则产生单步中断,引发中断过程,单步中断的中断类型码为1.
  例如Debug程序中的T命令,就会产生单步中断,CPU执行完一条指令后,显示寄存器状态并等待新命令的输入.
  注:单步中断处理程序的第一步必将是把TF置为0,否则将陷入无限循环中.
 
12.12 响应中断的特殊情况
  一般情况下,CPU在执行完一条指令后,如果检测到中断信息,就响应中断,引发中断过程.可是在某些特殊的情况下不会响应.
  如在执行完向SS传送数据的指令完成之后,即使有中断发生,也不影响,因为SS:SP联合完成指向栈顶工作,如果在改变SS时发生中断而去处理中断,栈顶数据会不一致.
 
实验12 编写0号中断处理程序
  略

posted @ 2012-06-27 12:41  Azik  阅读(389)  评论(0编辑  收藏  举报