外中断---汇编学习笔记
外中断
要及时处理外设的输入,显然需要解决两个问题:
- 外设的输入随时可能发生,CPU如何得知?
- CPU从何处得到外设的输入?
15.1 接口芯片和端口
外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。CPU还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。
15.2 外中断信息
有一种中断信息,来自于CPU外部,当CPU外部有需要处理的事情发生的时候,比如说,外设的输入到达,相关的芯片将向CPU发出相应的中断信息。CPU在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。
在PC系统中,外中断源一共有以下两类。
(1)可屏蔽中断
可屏蔽中断是CPU可以不响应的外中断。CPU是否响应可屏蔽中断,要看标志寄存器的IF位的设置。如果IF=1,则CPU在执行完当前指令后响应中断,如果IF=0,则不响应可屏蔽中断。
过程如下:
- 如果IF=1,则执行下面4步;反之,则不执行
- 取中断类型码n
- 标志寄存器入栈,IF=0,TF=0
- CS、IP入栈
- (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,所以中断过程:
- 标志寄存器入栈,IF=0,TF=0
- CS、IP入栈
- (IP)=(8),(CS)=(0AH)(IP)=(8),(CS)=(0AH)(IP)=(8),(CS)=(0AH)
几乎所有由外设引发的外中断,都是可屏蔽中断。当外设有需要处理的事件发生时,相关芯片向CPU发出可屏蔽中断信息。不可屏蔽中断是在系统中有必须处理的紧急情况发生时用来通知CPU的中断信息。在这门课程中,主要讨论可屏蔽中断。
15.3 PC机键盘的处理过程
很通俗易懂,略过。
键盘输入的处理过程:
- 键盘产生扫描码
- 扫描码送入60h端口
- 引发9号中断
- 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对外设输入的通常处理方法:
- 外设的输入送入端口
- 向CPU发出外中断(可屏蔽中断)信息
- CPU检测到可屏蔽中断信息,如果IF=1,CPU在执行完当前指令后响应中断,执行相应的中断例程
- 可在中断例程中实现对外设输入的处理
实验15 安装新的int 9中断例程
安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”;其他的按键照常处理。
分析:
- 在安装新int 9的时候,将原int 9的入口地址记录下来(可以在int 9的code段之前定义一个data段,用来记录原int 9中断例程的CS和IP)
- 安装新的int 9中断例程
- 如果遇到A的断码,则执行新int 9的指令
- 否则,执行原int 9的指令,而入口地址已经被我们记录下来了
外中断---汇编学习笔记相关推荐
- 内中断---汇编学习笔记
内中断 "中断信息"是要求CPU马上进行某种处理,并向所要进行的该种处理提供了必备的参数的通知信息. 12.1 内中断的产生 当CPU内部有下面的情况发生的时候,将产生相应的中断信 ...
- 汇编学习笔记——汇编指令
目录 汇编指令 nop指令 mov.add.sub指令 adc.sbb指令 and.or指令 移位指令 逻辑左/右移指令 循环左/右移指令 算术左/右移指令 带进位循环左/右移指令 inc指令 pus ...
- 汇编学习笔记——伪指令
目录 伪指令 段定义 结束标记 段关联标记 数据定义 标号 offset指令 seg指令 地址标号 数据标号 代码分段 程序标识 多文件系统 字符输入 重复定义 注释 重复汇编伪指令 伪指令汇总 伪指 ...
- 汇编学习笔记:对抗反汇编实验2019092801
汇编学习笔记:对抗反汇编实验2019092801 实验描述 实验环境 实验过程 实验结论 实验描述 使用相连的jz和jnz指令跳转到紧接着jnz指令的call指令的第二个字节.call指令实际上无效. ...
- 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...
<嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...
- GNU C内嵌汇编学习笔记
前文所述,只是针对汇编格式的整理,本文将使用coreboot项目代码对其进行实例化.以方便.清晰了解到如何在C语言里使用内嵌汇编的方法.同样地,网络上也有众多文章涉及到这方面,所以本文更多是归纳总结. ...
- 寄存器---汇编学习笔记
第二章 寄存器 2.0 寄存器的绪论 一个典型的CPU由运算器.控制器.寄存器(CPU工作原理)等器件构成.内部总线实现 CPU 内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系. 在C ...
- 使用BIOS进行键盘输入和磁盘读写---汇编学习笔记
汇编笔记 使用BIOS进行键盘输入和磁盘读写 17.1 int 9中断例程对键盘输入的处理 17.2 使用int 16h中断例程读取键盘缓冲区 17.3 字符串的输入 17.4 应用int 13h中断 ...
- 第一个程序---汇编学习笔记
第四章 第一个程序 4.1 一个源程序从写出到执行的过程 一个汇编语言程序从写到最终执行的简要过程. 编写汇编源程序 对源程序进行编译连接 执行可执行文件中的程序 如图所示: 4.2 源程序 程序代码 ...
最新文章
- [解决]eclipse中android自动补全/提示卡机或假死
- java TreeMap 源代码分析 平衡二叉树
- Laravel 中的异常处理
- tensolrflow之基础变量
- pip 安装 mysqlclient 报错 Command errored out with exit status 1
- 网络——在网络上发送,接收数据
- 在java中构建高效的结果缓存
- StyleGAN-基于样式的生成对抗网络(论文阅读总结)(精)
- 『BDD100K的labels文件json转YOLOV5要求的txt文件』【包括识别交通灯】(代码编写)
- Foundation 框架 NSArray、NSMutableArray排序
- Kafka从上手到实践 - Kafka CLI:Topic CLI Producer CLI | 凌云时刻
- VS系列编译器基本调试快捷键的使用
- Java工具类 BeanUtils库介绍以及对象拷贝
- 苹果平板做ppt方便吗_“你不是大学生吗,怎么连PPT都做不好?”
- ZeroMQ文档白嫖:一文述完ZeroMQ的套接字选项
- 趣店PHP面经_腾讯助理PHP开发工程师外包岗面经
- rds对mysql优化_RDS MySQL参数调优最佳实践
- 中国AI监控摄像头市场现状研究分析与发展前景预测报告(2022)
- 克隆Linux虚拟机
- Tmall商品详情API接口
热门文章
- NYOJ 662 汽水瓶
- 异想-天开 python---while、for、if-else 循环学习
- .NET 通用权限设计
- python day2 python基础 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码...
- mapReducer第一个例子WordCount
- python取出字典中的所有值的两种方法
- NVisionXR_iOS教程三 —— NVisionXR渲染一个立方体
- 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)...
- 腾讯云 wdcp ip:8080打不开,wdcp phpmyadmin打不开
- python 解析 配置文件