• 【笔记】【汇编语言】第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号中断处理程序
      略

  • 相关阅读:
    吊打XXX
    [CQOI2011]动态逆序对
    陌上花开
    【BOI2007】摩基亚Mokia
    [SCOI2008]奖励关
    最小生成树
    打表
    【中学高级本】倒酒
    整数合并
    韩信点兵
  • 原文地址:https://www.cnblogs.com/AzikPhil/p/note_asm2_12.html
Copyright © 2020-2023  润新知