9 内中断

news2024/12/26 0:12:52

内中断

任何一个通用的CPU,比如8086 ,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU 外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,我们可以称其为:中断信息。中断的意思是指, CPU 不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。

1 内中断的产生

对于8086CPU,当CPU 内部有下面的情况发生的时候,将产生相应的中断信息。

  • 除法错误,比如,执行div 指令产生的除法溢出:
  • 单步执行:
  • 执行into 指令:
  • 执行int 指令。

要进行不同的处理, CPU 首先要知道,所接收到的中断信息的来源。所以中断信息中必须包含识别来源的编码。8086CPU 用称为中断类型码的数据来标识中断信息的来源。中断类型码为一个字节型数据,可以表示256 种中断信息的来源。以后,我们将产生
中断信息的事件,即中断信息的来源, 简称为中断源, 上述的4 种中断源,在8086CPU中的中断类型码如下。

  • 除法错误:0
  • 单步执行:1
  • 执行into指令:4
  • 执行int指令:
  • 该指令的格式为int n,指令中的n 为字节型立即数,是提供给CPU 的中断类型码。

2 中断向量表

CPU 收到中断信息后,需要对中断信息进行处理。而如何对中断信息进行处理,可以由我们编程决定。我们编写的,用来处理中断信息的程序被称为中断处理程序。一般来说,需要对不同的中断信息编写不同的处理程序。若要8086CPU 执行某处的程序,就要将cs:IP指向它的入口(即程序第一条指令的地址) 。可见首要的问题是, CPU 在收到中断信息后,如何根据中断信息确定其处理程序的入口。

CPU 用8 位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。

中断向量,就是中断处理程序的入口地址。展开来讲,中断向量表,就是中断处理程序入口地址的列表。

中断向量表在内存中保存,其中存放着256 个中断源所对应的中断处理程序的入口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmbZoAK2-1670664899950)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221208135556335.png)]

一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,对于8086CPU ,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址。

3 中断过程

可以用中断类型码,在中断向量表中找到中断处理程序的入口。找到这个入口地址的最终目的是用它设置cs 和IP,使CPU 执行中断处理程序。用中断类型码找到中断向量,并用它设置cs 和IP ,这个工作是由CPU 的硬件自动完成的。CPU 硬件完成这个工作的过程被称为中断过程

CPU 在执行完中断处理程序后,应该返回原来的执行点继续执行下面的指令。所以在中断过程中,在设置CS:IP 之前,还要将原来的cs 和IP 的值保存起来。在使用call 指令调用子程序时有同样的问题,子程序执行后还要返回到原来的执行点继续执行,所以, call 指令先保存当前cs 和IP 的值,然后再设置cs 和IP

  1. (从中断信息中)取得中断类型码:
  2. 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中):
  3. 设置标志寄存器的第8 位TF 和第9 位IF 的值为0(这一步的目的后面将介绍):
  4. cs 的内容入栈;
  5. IP 的内容入栈:
  6. 从内存地址为中断类型码叫和中断类型码+2 的两个字单元中读取中断处理程序的入口地址设置IP 和cs 。

我们更简洁地描述中断过程,如下:

  1. 取得中断类型码N;
  2. pushf
  3. TF=O, IF=O
  4. push CS
  5. push IP
  6. (IP)=(N4), (CS)=(N4+2)
  7. 在最后一步完成后, CPU 开始执行由程序员编写的中断处理程序。

4 除法错误中断的处理

mov ax, lOOOh
mov bh,1
div bh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zkqQwHEE-1670664899951)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221208140338133.png)]

内存0000:0000~0000:03ff,大小为IKB 的空间是系统存放中断处理程序入口地址的中断向量表。8086 支持256 个中断,但是,实际上,系统中要处理的中断事件远没有达到256 个。所以在中断向量表中,有许多单元是空的。

中断向量表是PC 系统中最重要的内存区,只用来存放中断处理程序的入口地址,DOS 系统和其他应用程序都不会随便使用这段空间。可以利用中断向量表中的空闲单元来存放我们的程序。一般情况下,从0000:0200 至0000:02FF 的256 个字节的空间所对应
的中断向量表项都是空的,操作系统和其他应用程序都不占用。

当中断0发生时, CPU 将转去执行中断处理程序。只要按如下步骤编写中断处理程序,当中断。发生时,即可显示“overflow !”
① 相关处理:
② 向显示缓冲区送字符串“overflow !”;
③返回DOS 。
我们将这段程序称为: doO

assume cs:code
code segment
start : doO 安装程序
        设置中断向量表
        mov ax,4c00h
        int 2lh
   doO: 显示字符串” overflow !”
        mov ax,4c00h
        int 2lh
code ends
end start

从CPU 的角度看一下,什么是中断处理程序?

  1. 程序12.1 在执行时,被加载到内存中,此时doO 的代码在程序12.1 所在的内存空间中,它只是存放在程序12.1 的代码段中的一段要被传送到其他单元中的数据,我们不能说它是0 号中断的中断处理程序;
  2. 程序12.1 中安装doO 的代码执行完后, doO 的代码被从程序12.1 的代码段中复制到0:200 处。此时,我们也不能说它是0 号中断的中断处理程序,它只不过是存放在0:200 处的一些数据:
  3. 程序12.1 中设置中断向量表的代码执行完后,在0 号表项中填入了doO 的入口地址0:200 ,此时0:200 处的信息,即doO 的代码,就变成了0号中断的中断处理程序。因为当除法溢出(即0 号中断)发生时, CPU 将执行0:200 处的代码。

号表项中填入了doO 的入口地址0:200 ,此时0:200 处的信息,即doO 的代码,就变成了0号中断的中断处理程序。因为当除法溢出(即0 号中断)发生时, CPU 将执行0:200 处的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

S7-200SMART高速脉冲输出的使用方法和示例

S7-200SMART高速脉冲输出的使用方法和示例 S7-200SMART PLC内部集成了高速脉冲发生器,不同的CPU型号,高速脉冲发生器的数量不同。 具体型号可参考下图: 注意:要输出高速脉冲的话,必须选择ST晶体管型号的PLC,SR继电器型的不支持。 S7-200SMART PLC能产生2种类型的高速脉冲…

【瑞吉外卖】公共字段填充

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉瑞吉外卖 ✨欢迎加入社区: 👉不会压弯的小飞侠 ✨人生格言:知足上…

激光雷达标定(坐标系转换)

文章目录1. 旋转矩阵2. 平移矩阵3. 坐标系的转换4. 坐标转换代码1. 旋转矩阵 由于激光雷达获取的点云数据的坐标是相对于激光雷达坐标系的,为了使车最终得到的点云数据坐标是在车坐标系下的,我们需要对点云中每一个点的坐标进行坐标转换。首先是需要对坐…

Docker笔记--创建容器、退出容器、查看容器、进入容器、停止容器、启动容器、删除容器、查看容器详细信息

目录 1--docker run创建容器 2--exit退出容器 3--docker ps查看容器 4--docker exec进入容器 5--docker stop停止容器 6--docker start启动容器 7--docker rm删除容器 8--docker inspect查看容器详细信息 1--docker run创建容器 sudo docker run -it --nametest redis…

Python 可迭代对象(Iterable)、迭代器(Iterator)与生成器(generator)之间的相互关系

1、迭代 通过重复执行的代码处理相似的数据集的过程&#xff0c;并且本次迭代的处理数据要依赖上一次的结果继续往下做&#xff0c;上一次产生的结果为下一次产生结果的初始状态&#xff0c;如果中途有任何停顿&#xff0c;都不能算是迭代。 # 非迭代例子 n 0 while n < …

SSM如何

目录 1、整合Mybatis 1.1.新建项目 1.2.添加pom依赖 1.3.application.yml 1.4.generatorConfig.xml 1.5.设置逆向生成 1.6.编写controller层 1.7.测试 2、整合 Mybatis-plus 2.1Mybatis-plus简介 2.2.创建项目 2.3.添加pom依赖 2.4.application.yml 2.5.MPGenerator 2.6.生成…

Stm32旧版库函数1——adxl335 模拟输出量 usart2

主函数&#xff1a; /******************************************************************************* // // 使用单片机STM32F103C8T6 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 19200 串口2 PA2(Tx) P…

equals方法:黑马版

目录 Object类的equals方法 Student类 测试类 第一步&#xff1a;使用比较 第二步&#xff1a;使用equals比较 第三步&#xff1a;在子类-Student类中重写equals方法 代码逐句分析 运行 Object类的equals方法 首先写一个类Student&#xff0c;属性有name和age&#xf…

UE5笔记【十二】蓝图函数BluePrint Function

上一篇讲了蓝图变量&#xff0c;这一篇说蓝图函数。BluePrint Function 函数&#xff0c;一般是为了将一段功能的代码提取出来&#xff0c;然后方便我们反复使用。重复的代码可以提取一个函数。类似的&#xff0c;相同的蓝图&#xff0c;我们也可以提取出一个蓝图函数来。 如…

青龙面板 香蕉

香蕉角本教程 介绍 香蕉视频 app —【多用户版】 一个账户每天稳定1元&#xff0c;可以自己提现&#xff0c;也可以兑换会员&#xff0c;脚本不停会员也不停&#xff01;可注册多个账户&#xff01;&#xff08;多账户福利自行看文章底部&#xff01;&#xff09; 拉取文件 …

【微服务】springboot 整合javassist详解

一、前言 Javassist 是一个开源&#xff0c;用于分析、编辑和创建Java字节码的类库&#xff0c;由东京工业大学数学和计算机科学系的 Shigeru Chiba &#xff08;千叶滋&#xff09;所创建。目前已加入了开放源代码JBoss 应用服务器项目&#xff0c;通过使用Javassist对字节码操…

linux redhat 8 创建逻辑卷

LVM与直接使用物理存储相比,有以下优点: 1. 灵活的容量. 当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多个磁盘或磁盘分区成单一的逻辑卷. 2. 方便的设备命名 逻辑卷可以按你觉得方便的方式来起任何名称. 3.磁盘条块化. 你可以生成一个逻辑盘,它的数据可以被…

记录一次Mac本地启动nacos遇到的问题

nacos 官网&#xff1a;https://nacos.io/zh-cn/docs/quick-start.html 我这里下载的是2.0.3稳定的版本 本地启动&#xff1a;sh startup.sh -m standalone 问题1&#xff1a;Caused by: java.lang.IllegalStateException: No DataSource set 这里是数据源连接有问题&#xff…

Linux网络原理及编程(6)——第十六节 TCP可靠性保证的原理

目录 1、确认应答机制 2、超时重传机制 3、滑动窗口 4、流量控制 5、拥塞控制 6、延迟应答 &#xff08;各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&am…

Apache Flink 水印的工作机制详解与源码阅读

一、时间长河谁能解 在人类生存的地球上&#xff0c;存在着一种很神秘的东西&#xff1a;时间&#xff0c;它看不见摸不着&#xff0c;但速度恒定&#xff0c;单调递增且永无止境的往前推进&#xff0c;人类的历史被淹没在茫茫的时间长河中。同时在地球附近&#xff0c;一个星…

【自动化测试】如何平衡手工和自动化测试

作为一名测试人员&#xff0c;如何平衡手工和自动化测试&#xff0c;是一道绕不过去的课题。不可否认&#xff0c;自动化测试具有提高效率&#xff0c;加快回归速度并因此有助于及时交付项目的好处。但是&#xff0c;在考虑自动化之前&#xff0c;我们应该评估一些要点&#xf…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生就业管理系统243xa

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

vscode 关闭/忽略/ignore 单个/指定 git 仓库/repository 提示

文章目录1. 问题2. 解决方法2.1 只追踪 打开文件 所在的仓库2.2 忽略指定的仓库3. 参考1. 问题 vscode 当打开的项目中有多个 git 仓库时&#xff0c;默认会显示所有仓库的 status。 有些已经不再使用的仓库可能有多处更改&#xff0c;但我们并不想去处理它。 如果直接关闭 vs…

gcc 4.8.5 的string问题

gcc 4.8.5及一下版本 的string 因为内部内存管理采用了COW的方式&#xff0c;导致了string在多线程的状态下容易崩溃。崩的很没有规律&#xff0c;表现就是string在赋值的时候就莫名其妙的崩了&#xff0c;查看堆栈&#xff0c;你也看不出啥。崩溃的很随机。 为了避免崩溃&…

文本纠错--文本分割N-gram--Macbert模型的调用以及对返回结果的处理

文本根据词典进行纠错 输入一段可能带有错误信息的文字&#xff0c; 通过词典来检测其中可能错误的词。 例如&#xff1a;有句子如下&#xff1a;中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂    有词典如下&#xff1a;中国人民&#xff0c;中央人民&#x…