欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2023/11/30 71 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【汇编语言】王爽 - 内中断复习 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

0 前言

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

1 中断分类

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

这个异常可以来源于

  • 内部中断
  • 指令执行本身:例如 0号中断(除法错中断 自动检测、INT 0)、4号中断(溢出中断 INTO、INT 4)
  • 程序调试,例如1号中断(单步中断 INT 1)、3号中断(断点中断 INT 3)
  • 外部中断:与CPU相关的信号有关
  • 可屏蔽中断
  • 不可屏蔽中断
  • 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 触发 & 执行

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

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

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

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

    3 对中断的理解

    3.1 中断是什么?

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

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

    3.2 中断来源于哪?

  • 程序内部出现异常
  • 程序内部主动请求中断
  • 外部设备请求中断
  • 外部中断分为可屏蔽(可以不理会!)和不可屏蔽中断(必须执行!不可忽略!)。

    3.3 中断何时发生?

    查看中断向量表即可。

    3.4 中断执行过程是什么?

  • 检测到中断
  • 保存现场,屏蔽外界中断,屏蔽单步中断
  • 根据中断向量表的地址,修改CS:IP
  • 执行中断服务程序
  • 恢复现场
  • 继续执行
  • 3.5 中断服务程序是什么?

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

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

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

  • 编写一段普通的程序(指令 + 数据)
  • 将其拷贝到特殊的内存位置(指令和数据都要一起拷贝)
  • 将其入口地址写入到中断向量表中
  • 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程序中已经能够实现中断触发,对着这种指令,不要写在程序中,调试程序直接让程序运行在调试模式下就好了。

    总结

    以上是生活随笔为你收集整理的【汇编语言】王爽 - 内中断复习的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。