外中断

要及时处理外设的输入,显然需要解决两个问题:

  1. 外设的输入随时可能发生,CPU如何得知?
  2. CPU从何处得到外设的输入?

15.1 接口芯片和端口

外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。CPU还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。


15.2 外中断信息

有一种中断信息,来自于CPU外部,当CPU外部有需要处理的事情发生的时候,比如说,外设的输入到达,相关的芯片将向CPU发出相应的中断信息。CPU在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。

在PC系统中,外中断源一共有以下两类。

(1)可屏蔽中断
可屏蔽中断是CPU可以不响应的外中断。CPU是否响应可屏蔽中断,要看标志寄存器的IF位的设置。如果IF=1,则CPU在执行完当前指令后响应中断,如果IF=0,则不响应可屏蔽中断。

过程如下:

  1. 如果IF=1,则执行下面4步;反之,则不执行
  2. 取中断类型码n
  3. 标志寄存器入栈,IF=0,TF=0
  4. CS、IP入栈
  5. (IP)=(n∗4),(CS)=(n∗4+2)(IP)=(n∗4),(CS)=(n∗4+2)(IP)=(n*4),(CS)=(n*4+2)

8086CPU提供的设置IF的指令如下:

sti,设置IF=1
cli,设置IF=0

(2)不可屏蔽中断
不可屏蔽中断是CPU必须响应的外中断。当CPU检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程。

对于8086CPU,不可屏蔽中断的中断类型码固定为2,所以中断过程:

  1. 标志寄存器入栈,IF=0,TF=0
  2. CS、IP入栈
  3. (IP)=(8),(CS)=(0AH)(IP)=(8),(CS)=(0AH)(IP)=(8),(CS)=(0AH)

几乎所有由外设引发的外中断,都是可屏蔽中断。当外设有需要处理的事件发生时,相关芯片向CPU发出可屏蔽中断信息。不可屏蔽中断是在系统中有必须处理的紧急情况发生时用来通知CPU的中断信息。在这门课程中,主要讨论可屏蔽中断。


15.3 PC机键盘的处理过程

很通俗易懂,略过。

键盘输入的处理过程:

  1. 键盘产生扫描码
  2. 扫描码送入60h端口
  3. 引发9号中断
  4. CPU执行int 9中断例程处理键盘输入

15.4 编写int 9中断例程

内容自己看,也很易读。

检测点 15.1
(1)仔细分析一下上面的int 9中断例程,看看是否精简一下?其实在我们的int 9中断例程中,模拟int指令调用原int 9中断例程的程序段可以精简的,因为在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了,对于程序段:

pushf
pushf
pop ax
and ah,11111100b
push ax
popf
call dword ptr ds:[0]

可以精简为:

pushf
call dword ptr ds:[0]

(2)仔细分析上面程序中的主程序,看看有什么潜在问题?在主程序中,如果在执行设置int 9中断例程的段地址和偏移地址的指令之间发生了键盘中断,则CPU将转去一个错误的地址执行,将发生错误。找出这样的程序段,改写它们,排除潜在问题。(提示,注意sti和cli指令的用法)
答:应该在执行设置int 9的CS之前将IF置0,设置int 9的IP之后将IF置1(设置新int 9的地方和设置旧int 9的地方,这2处需要将IF置0和置1)。


15.5 安装新的int 9中断例程

略过。

CPU对外设输入的通常处理方法:

  1. 外设的输入送入端口
  2. 向CPU发出外中断(可屏蔽中断)信息
  3. CPU检测到可屏蔽中断信息,如果IF=1,CPU在执行完当前指令后响应中断,执行相应的中断例程
  4. 可在中断例程中实现对外设输入的处理

实验15 安装新的int 9中断例程

安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”;其他的按键照常处理。
分析:

  1. 在安装新int 9的时候,将原int 9的入口地址记录下来(可以在int 9的code段之前定义一个data段,用来记录原int 9中断例程的CS和IP)
  2. 安装新的int 9中断例程
    1. 如果遇到A的断码,则执行新int 9的指令
    2. 否则,执行原int 9的指令,而入口地址已经被我们记录下来了


外中断---汇编学习笔记相关推荐

  1. 内中断---汇编学习笔记

    内中断 "中断信息"是要求CPU马上进行某种处理,并向所要进行的该种处理提供了必备的参数的通知信息. 12.1 内中断的产生 当CPU内部有下面的情况发生的时候,将产生相应的中断信 ...

  2. 汇编学习笔记——汇编指令

    目录 汇编指令 nop指令 mov.add.sub指令 adc.sbb指令 and.or指令 移位指令 逻辑左/右移指令 循环左/右移指令 算术左/右移指令 带进位循环左/右移指令 inc指令 pus ...

  3. 汇编学习笔记——伪指令

    目录 伪指令 段定义 结束标记 段关联标记 数据定义 标号 offset指令 seg指令 地址标号 数据标号 代码分段 程序标识 多文件系统 字符输入 重复定义 注释 重复汇编伪指令 伪指令汇总 伪指 ...

  4. 汇编学习笔记:对抗反汇编实验2019092801

    汇编学习笔记:对抗反汇编实验2019092801 实验描述 实验环境 实验过程 实验结论 实验描述 使用相连的jz和jnz指令跳转到紧接着jnz指令的call指令的第二个字节.call指令实际上无效. ...

  5. 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...

    <嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...

  6. GNU C内嵌汇编学习笔记

    前文所述,只是针对汇编格式的整理,本文将使用coreboot项目代码对其进行实例化.以方便.清晰了解到如何在C语言里使用内嵌汇编的方法.同样地,网络上也有众多文章涉及到这方面,所以本文更多是归纳总结. ...

  7. 寄存器---汇编学习笔记

    第二章 寄存器 2.0 寄存器的绪论 一个典型的CPU由运算器.控制器.寄存器(CPU工作原理)等器件构成.内部总线实现 CPU 内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系. 在C ...

  8. 使用BIOS进行键盘输入和磁盘读写---汇编学习笔记

    汇编笔记 使用BIOS进行键盘输入和磁盘读写 17.1 int 9中断例程对键盘输入的处理 17.2 使用int 16h中断例程读取键盘缓冲区 17.3 字符串的输入 17.4 应用int 13h中断 ...

  9. 第一个程序---汇编学习笔记

    第四章 第一个程序 4.1 一个源程序从写出到执行的过程 一个汇编语言程序从写到最终执行的简要过程. 编写汇编源程序 对源程序进行编译连接 执行可执行文件中的程序 如图所示: 4.2 源程序 程序代码 ...

最新文章

  1. [解决]eclipse中android自动补全/提示卡机或假死
  2. java TreeMap 源代码分析 平衡二叉树
  3. Laravel 中的异常处理
  4. tensolrflow之基础变量
  5. pip 安装 mysqlclient 报错 Command errored out with exit status 1
  6. 网络——在网络上发送,接收数据
  7. 在java中构建高效的结果缓存
  8. StyleGAN-基于样式的生成对抗网络(论文阅读总结)(精)
  9. 『BDD100K的labels文件json转YOLOV5要求的txt文件』【包括识别交通灯】(代码编写)
  10. Foundation 框架 NSArray、NSMutableArray排序
  11. Kafka从上手到实践 - Kafka CLI:Topic CLI Producer CLI | 凌云时刻
  12. VS系列编译器基本调试快捷键的使用
  13. Java工具类 BeanUtils库介绍以及对象拷贝
  14. 苹果平板做ppt方便吗_“你不是大学生吗,怎么连PPT都做不好?”
  15. ZeroMQ文档白嫖:一文述完ZeroMQ的套接字选项
  16. 趣店PHP面经_腾讯助理PHP开发工程师外包岗面经
  17. rds对mysql优化_RDS MySQL参数调优最佳实践
  18. 中国AI监控摄像头市场现状研究分析与发展前景预测报告(2022)
  19. 克隆Linux虚拟机
  20. Tmall商品详情API接口

热门文章

  1. NYOJ 662 汽水瓶
  2. 异想-天开 python---while、for、if-else 循环学习
  3. .NET 通用权限设计
  4. python day2 python基础 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码...
  5. mapReducer第一个例子WordCount
  6. python取出字典中的所有值的两种方法
  7. NVisionXR_iOS教程三 —— NVisionXR渲染一个立方体
  8. 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)...
  9. 腾讯云 wdcp ip:8080打不开,wdcp phpmyadmin打不开
  10. python 解析 配置文件