【汇编语言】王爽 - 内中断复习

0 前言

基于王爽《汇编语言》和Coursera的《计算机组成》课程。

1 中断分类

CPU在执行指令的过程中,产生了一个异常/中断,因为CPU只能同时执行一条指令,所以需要暂停该指令的执行,转而去处理异常/中断信息
在这里插入图片描述
在这里插入图片描述

这个异常可以来源于

  1. 内部中断
    1. 指令执行本身:例如 0号中断(除法错中断 自动检测INT 0)、4号中断(溢出中断 INTOINT 4
    2. 程序调试,例如1号中断(单步中断 INT 1)、3号中断(断点中断 INT 3
  2. 外部中断:与CPU相关的信号有关
    1. 可屏蔽中断
    2. 不可屏蔽中断

2 内中断实例分析:除法错中断

我们来看一看除法错中断发生的完整过程,来理解中断的相关概念。

2.0 来源

程序实例

assume cs:datasg
datasg segment
start:mov ax,1000hmov bh,1div bhmov ax,4c00hint 21h
datasg ends
end start

2.1 产生 & 检测

很明显,1000h / 1得到的商超过了8位(AL的范围),会产生溢出。从而被CPU内部的中断检测部件检测出来,触发中断机制。

2.2 触发 & 执行

中断机制被触发后,会做出一系列动作,先执行中断程序,再回来继续执行原程序,注意,这里的说明相对抽象。

  1. 识别中断源,触发对应的中断信息(这里是0号中断
  2. 保存现场
    1. 标志寄存器入栈 pushf
    2. 修改标志寄存器:IF = 0TF = 0(不接收可屏蔽中断,不进行单步中断)
    3. CS:IP入栈(老大CS先入栈,然后是IP)
  3. 根据中断向量表中,相应中断源的值,修改CS:IP,执行中断服务程序
  4. 执行完后,执行iret,依次出栈,恢复现场。
  5. 接着执行下面的指令(可能是出现异常的指令,也可能是下一条指令,与实际情况有关)

2.3 修改0号中断

0号中断是存储在8086CPU内存的中断向量表中,0x0000 ~ 0x03ff,共400H,也就是1MB的空间。

写一段程序,然后将其拷贝到被保护的内存区域(指令和数据都要),然后,将中断向量表对应的地址修改,这样,这段程序就成为了中断服务程序,可以被动调用,也可以主动调用。

3 对中断的理解

3.1 中断是什么?

指令执行过程中,有其他事务要优先处理,需要放下当前执行的指令,执行完其他事务再回来执行。

这就好比,你在写作业,突然你妈妈让你去买酱油,你就需要先放下作业,买完酱油回来,再写作业。这里买酱油就是一个中断

3.2 中断来源于哪?

  1. 程序内部出现异常
  2. 程序内部主动请求中断
  3. 外部设备请求中断

外部中断分为可屏蔽(可以不理会!)和不可屏蔽中断(必须执行!不可忽略!)。

3.3 中断何时发生?

查看中断向量表即可。

3.4 中断执行过程是什么?

  1. 检测到中断
  2. 保存现场,屏蔽外界中断,屏蔽单步中断
  3. 根据中断向量表的地址,修改CS:IP
  4. 执行中断服务程序
  5. 恢复现场
  6. 继续执行

3.5 中断服务程序是什么?

普通的一段程序,如果其入口地址被放在了中断向量表的某个中断中,这个程序就是【中断服务程序】

发生中断时,系统给出的解决方案,就是中断服务程序。其入口地址存放在中断向量表中,程序系统默认有,也可以自己编写。

3.6 中断服务程序如何编写和安装?

  1. 编写一段普通的程序(指令 + 数据)
  2. 将其拷贝到特殊的内存位置(指令和数据都要一起拷贝)
  3. 将其入口地址写入到中断向量表中

3.7 中断的功能是什么?

3.7.1 自动调用:(Checked)异常处理

比如除法错中断,就是系统自动检测并处理的。

3.7.2 手动调用:(Unchecked)异常处理

比如溢出中断,需要手动写INTO(Interrupt Overflow)指令,才会进行处理,否则运算溢出的时候不做任何处理。

3.7.3 手动调用:系统调用(System Call)

主动使用中断,能够帮助程序员快速实现一些功能,这也就是基于中断机制的功能调用,极大提高了开发效率。

4 单步中断 & 断点中断

这两个中断类型,就是单步调试断点调试背后的实现机制,方便程序员调试程序。

4.1 单步中断

TF标志位为1的时候,发生单步中断,然后就被置0,防止无限嵌套中断发生。

单步中断是为了方便调试程序和查看寄存器等相关内容的值。

4.2 断点中断

对于INT n。n一共是256个,占1个字节,INT指令码占1个字节,共2个字节,而**断点中断(INT 3)**特殊,占1个字节,其编码是1100_1100B,这与其实现机制有关。

断点中断是通过INT 3指令主动调用的,执行的时候,该指令会临时替换断点处的1个字节,遇到了就发生中断,显示寄存器和其他相关内容的值,便于程序员调试。

x86指令系统中,指令最少1个字节,因此INT 3也是1个字节,这样INT 3的替换,至多影响1条指令。 如果不是1个字节,可能影响2条指令,发生错误。

4.3 应用

例如debug的t命令,还有插入断点等,都是基于单步中断和断点中断机制实现,它们的出现是为了方便程序调试,并且在debug程序中已经能够实现中断触发,对着这种指令,不要写在程序中,调试程序直接让程序运行在调试模式下就好了。

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

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

相关文章

【算法】蛮力法/穷举法/枚举法 的基本问题分析

炮兵问题的优化,设立逻辑数组 蛮力法设计思想 有策略地穷举 验证 制定穷举策略避免重复 简单来说,就是列举问题所有可能的解,然后去看看是否满足题目要求,是一种逆向解题方式。(我也不知道答案是什么,…

如何高效学习算法【实例 + 可视化】

对于初学者来说,学习算法,不应该先学习抽象的理论,那样没有感觉,越学越晕,应该: 有具体的例子有可视化过程 同时需要结合理论知识对照学习,理论扎实、实践有效,同时要有结果反馈。…

【计算机网络实验·北航】实验一:网络实验入门(1)

1.3 远程在线环境使用 PCA、PCB、PCC和PCD:4台PC机S1、S2:2台交换机R1、R2:2台路由器中间的设备:组网连线器 远程组网连线: 使用PCA上的组网连线软件,配置组网连线器,实现组网连线。 PCA和PCB…

【C++】int与string转换

头文件&#xff1a;<string>&#xff0c;注意&#xff0c;这与<string.h>、<cstring>不是一回事儿语法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函数的基本使用

rand()函数用于生成伪随机数&#xff0c;每次生成的随机数都不变&#xff0c;方便我们调试程序。 重要是的随机数的范围公式&#xff08;适用整数&#xff09; 公式&#xff1a; 确定范围加偏移量 例如&#xff1a;a和b是整数 [a,b]&#xff0c;范围是b - a 1&#xff0c…

【操作系统】虚拟化CPU、Memory,共享文件

几个概念 CPU、虚拟CPU进程内存、虚拟地址空间 物理的CPU被OS虚拟成了多个虚拟的CPU&#xff0c;这些虚拟CPU分别运行各自的程序&#xff0c;这些正在运行的程序被称为进程。物理内存被OS虚拟成了多个虚拟地址空间&#xff0c;每个进程都有独立的、自己的地址空间&#xff0c;…

【Linux】编译C语言文件(-o -lpthread)

在gcc中使用-o编译 对于一个一般的程序&#xff0c;直接使用gcc <C语言文件名> -o <编译后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…

【Linux】Ubuntu下进行C语言编程

前言 需要您会使用Windows下cd切换目录的基本命令&#xff0c;否则请先自学相关知识&#xff0c;之后再阅读本文。 0 基础命令 介绍最基础的Linux终端命令。 su - root&#xff1a;切换到root用户&#xff08;不用也可以&#xff09;ls&#xff1a;查看当前目录位置cd&…

【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)

前言 本文写于2020年10月&#xff0c;如果你多年后看见这篇文章&#xff0c;方法可能已经失效&#xff0c;但是请牢记&#xff0c;尽量下载你所处时代的最新版本的软件&#xff0c;会减少很多麻烦。 摆正心态 即便按照本文操作&#xff0c;由于你的系统状态和我的不一样&…

【操作系统】进程调度(1):FIFO(先进先出)算法 原理与实践

0 前言 本文基于书籍《Operating System&#xff1a;Three Easy Pieces》。 中译本&#xff1a;《操作系统导论》&#xff0c;中译本质量还可以&#xff0c;但是英文版后来的更新&#xff0c;中文版目前没有进行同步更新&#xff08;写下此文的时间是2020年10月&#xff09; 1…

【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;1&#xff09;&#xff1a;FIFO&#xff08;先进先出&#xff09;算法 原理与实践 1 前提铺垫 请参考上一篇文章的前提铺垫部分&#xff0c;本文与之完全一致。 2 SJF 原理 SJF&#xff08;Shortest Job First&#x…

【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;2a&#xff09;&#xff1a;SJF&#xff08;短任务优先&#xff09; 算法 原理与实践 1 前提铺垫 与上一篇同。 2 STCF 原理 STCF&#xff08;Shortest Time-to-Completion First&#xff09;最短完成时间优先。 2.1…

【操作系统】进程调度(3):RR(轮转) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;2b&#xff09;&#xff1a;STCF&#xff08;最短完成时间优先&#xff09; 算法 原理与实践 1 前提铺垫 除了与上一篇相同的&#xff0c;这里介绍新的基础知识。 1.1 三种类型的程序 计算密集型&#xff08;CPU导向&…

【操作系统】进程调度(4):I/O、不可预测的运行时间

0 前言 上一篇文章&#xff1a;进程调度&#xff08;3&#xff09;&#xff1a;RR&#xff08;轮转&#xff09; 算法 原理与实践 1 前提铺垫 与上一篇同。 2 引入I/O操作 之前我们一直提及的是计算密集型程序&#xff0c;现在我们的程序可以进行I/O交互了&#xff0c;它会…

坚定不移地加速,并且不断解决新问题

想要更快更高效地做事&#xff0c;一定会带来问题&#xff0c;我们要做的是 保证事情一定要做对坚定不移地解决问题&#xff0c;寻找方法&#xff0c;而不是回归慢速 这里有几个典型的例子 从单周期CPU&#xff0c;到多周期CPU&#xff0c;是为了提速&#xff0c;我们不必再…

运行bat批处理文件不出现黑框

if "%1""hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit :CmdBegin echo off java -jar logisim118.exe exit 只需要添加上述代…

【操作系统】使用循环创建线程,一个手残导致的bug

让我们先看看这个手残的程序…… 这是一个简单的生产者消费者问题。 #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #incl…

【计算机系统设计】重点 · 学习笔记(0)

HDL等硬件描述语言&#xff0c;例如Verilog&#xff0c;是并行的&#xff0c;而不像软件一样的顺序执行的&#xff0c;例如很多的always块&#xff0c;initial块&#xff0c;都是并行的&#xff0c;他们会转换为硬件电路&#xff0c;而在仿真的时候&#xff0c;他们也是并发执行…

【计算机系统设计】学习笔记(1)03,04

疑问&#xff1a;sw和lw指令&#xff0c;获取的地址不是4的整倍数&#xff08;字节不对齐&#xff09;的时候&#xff0c;应该如何处理&#xff1f; 东南大学MOCC 计算机系统综合设计 03 03-1 寄存器 介绍了MIPS寄存器&#xff0c;32个寄存器的基本功能和使用&#xff0c;注…

【期末考试】计算机网络、网络及其计算 考试重点

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 计算机网络及其计算 期末考点 &#x1f680;数…