不同类型内中断的区分-中断类型码

8086cpu中在下面4种情况下会产生内中断:(1),除法错误 (如之前提到的除法溢出)      (2),单步执行      (3),执行into指令      (4),执行int指令。那么当内中断发生时cpu如何来区分到底是哪种中断源呢?
      通过中断类型码,这是一个字节数据,一共可以表示256种中断信息的来源。上述中断信息对应的中断类型码为:(1),除法错误:0      (2),单步执行:1      (3),执行into指令:4      (4),执行int指令,该指令的格式为int n,其中n为字节型立即数,是提供给cpu的中断类型码。(如前面经常用到的 int 21h)

如何找到相对应的中断处理程序-中断向量表

一旦发现了某种内中断的产生后,需要执行相关的中断处理程序来对中断进行处理。cpu要想执行中断处理程序的话,就需要让CS:IP指向它,那么从哪里找到相应的中断处理程序入口地址呢?
      中断向量表,顾名思义,这个表里面存储着中断向量,而每一个中断向量就是一个中断处理程序的入口地址,在内存高地址处存放CS,低地址存放IP。有256种中断源,那么就有256种中断向量,二者是一一对应的。中断向量表存储在内存的0000;0000-0000:03ff之间的1024个内存单元处。
      对于N号内中断,它的中断处理程序入口地址中的段地址为4*N+2,偏移地址为4*N

中断过程和中断处理程序

中断过程:
(1)从中断信息中取得中断类型码N
(2)标志寄存器的值入栈(中断过程会改变标志寄存器的值,故先将其保存)。pushf
(3)设置标志寄存器的第8位TF和第9位IF的值为0。TF=0,IF=0
(4)CS的内容入栈。push cs
(5)IP的内容入栈。push ip
(6)读取相应的中断处理程序的入口地址用来设置CS和IP。(IP)=4*N,(CS)=4*N+2

中断处理程序:
(1)保存用到的寄存器
(2)处理中断
(3)恢复用到的寄存器
(4)用iret指令返回,(pop IP,pop CS,popf 刚好对应于中断过程的寄存器入栈顺序,用来恢复cpu中断前的现场环境)

单步执行

cpu在执行完一条指令后,如果检测到标志寄存器的TF位为1,则产生单步中断。单步中断的中断类型码为1,它的中断过程为:(1)取得中断类型码1(2)标志寄存器入栈,TF、IF置为0(3)CS、IP入栈(4)设置(IP)=1*4,(CS)=1*4+2
      Debug的单步执行t命令就是利用了cpu的单步中断功能。首先,Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令;然后,在使用t命令执行指令时,Debug将TF设置为1,使得cpu工作于单步中断方式下,因此在cpu执行完这条指令后引发单步中断,而执行单步中断的中断处理程序会将所有寄存器的内容显示在屏幕上,并等待输入命令。
      如果在TF=1时引发单步中断转而执行中断处理程序。而此时TF=1,则在执行中断处理程序的第一条指令后又引发单步中断,又得去执行中断处理程序,但是又因为TF=1引发单步中断,…从而陷入死循环中。所以在执行中断处理程序前需要将TF设置为0,这也是我们之前所做的工作。

特殊情况(向ss寄存器中传送数据)

在ss寄存器中传送数据后,即使发生中断,cpu也不会响应。因为ss:sp联合指向栈顶,对它们的设置应该连续完成,否则在中断过程中的寄存器入栈保存操作会出现错误。所以:我们应该将设置ss和sp的指令连续存放,使得设置sp的指令紧接着设置ss的指令执行。
      Debug利用了cpu的单步中断功能,在mov ss,ax指令执行后,cpu不响应任何中断,所以Debug也没法将此时的寄存器状态用中断处理程序来显示出来,只有当下一步设置sp的指令执行后,cpu可以进行中断响应了,Debug的t命令才能执行单步中断的中断处理程序来显示寄存器的内容。

实验12

编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divede error!",然后返回到DOS。

 assume cs:codecode segmentstart: mov ax,csmov ds,axmov si,offset s0mov ax,0mov es,axmov di,200hcldmov cx,offset s0end-offset s0rep movsb            安装中断处理程序到0000:0200处mov ax,0mov ds,axmov word ptr [0*4],200hmov word ptr [0*4+2],0      更改中断向量表mov ax,4x00hint 21hs0: jmp short stdb "divide error!"st: mov ax,csmov ds,axmov si,202hmov ax,0b800hmov es,axmov di,12*160+32*2mov cx,13lo: mov al,[si]mov es:[di],alinc siadd di,2loop lomov ax,4c00hint 21h  s0end:nop               中断处理程序code endsend start

汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)相关推荐

  1. 汇编语言随笔(16)- 对磁盘进行读写(int 13h 中断例程)和实验 17

    磁盘读写 3.5 英寸软盘分为上下两面,每面有 80 个磁道,每个磁道又分为 18 个扇区,每个扇区的大小为 512 个字节.下面的磁盘读写均以 3.5 英寸软盘为例. 在读写扇区的时候,要给出面号. ...

  2. 汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)

    int 指令 int 指令的格式为:int n,n为中断类型码.这里由 n 显式的给出了调用哪一个中断处理程序.       CPU 的中断过程仍然是: (1)取中断类型码n (2)标志寄存器入栈,I ...

  3. 汇编语言随笔(13)- 外中断(可屏蔽中断)、实验15

    端口的作用 在PC系统的接口卡和主板上,装有各种接口芯片.这些外设接口芯片内部有若干寄存器,CPU将这些寄存器当作端口来访问.       外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端 ...

  4. 汇编语言-第三版-王爽-实验6、7、9、10、11、12、13、14、15

    实验6(p160).实验7(p173).实验9(p189).实验10(p206,p208, p209).实验11(p234).实验12(p251).p256(编写7cH中断例程完成loop指令功能). ...

  5. 8086汇编学习小记-王爽汇编语言实验12

    8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...

  6. 《汇编语言》王爽(第四版) 第十二章 实验12

    文章目录 前言 一.思路分析 1.安装 2.设置中断向量 3.do0程序 4.测试 5.优化 二.最终成果 1.完整代码 2.效果图 总结 前言 本文是王爽老师<汇编语言>(第四版) 第十 ...

  7. 汇编语言实验12完整代码及详细解析

    汇编语言实验12完整代码及考察点 建议先自己思考问题的答案,不懂则返回看书 很简单的一个程序,不做额外的分析,看代码就懂了.本章主要是理解中断的过程.原理. assume cs:code code s ...

  8. 汇编语言笔记(四):内中断

    汇编语言笔记:内中断 章节目录 概念 中断过程 示例: 0 号中断处理 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 概念 中 ...

  9. ATT汇编语言与GCC内嵌汇编简介

    AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 G ...

最新文章

  1. Deepfit: 通过神经网络加权最小二乘法进行3D表面拟合
  2. “CAIL 2021中国法律智能技术评测”全面开启!
  3. vs2017运行yolov4_windows10+vs2017+opencv3.4.1配置YOLOV4
  4. iOS Ruby出现问题,导致无法安装Pod
  5. Synchronize锁对象
  6. PowerBI 报表服务器刷新失败自动重刷并邮件通知
  7. 华为平板wps语音朗读_打工人必备的手机端WPS小技巧
  8. 控件必须放在具有 runat=server 的窗体标记内错误的解决方法
  9. C#图片处理之:最简单的柔化算法
  10. python装饰器与闭包_Python:函数装饰器和闭包
  11. Linux-nginx安装
  12. Linux软件安装及修改软件源
  13. 自己手动编译mpc-hc播放器
  14. thinningopencv
  15. 智安网络丨IPv6 为网络安全带来新机遇
  16. java将字符串转成对象_java – 将字符串转换为类对象
  17. 收支两条线资金管理模式的应用
  18. 详解在Linux系统中安装JDK
  19. python抓取京东联盟优惠券_[爬虫]使用python抓取京东全站数据(商品,店铺,分类,评论)...
  20. 网络营销实战课-微信实操

热门文章

  1. 11-jQuery的事件绑定和解绑
  2. Linux系统调用--getrlimit()与setrlimit()函数详解
  3. python3 deque(双向队列)
  4. Java_IO流_抽象类
  5. 转:Siri之父:语音交互或将主导未来十年发展
  6. 解决Windows7 Embedded连接手机问题
  7. LockBits in GDI+【转】http://timothyqiu.com/archives/lockbits-in-gdiplus/
  8. escape相关方法使用
  9. pip无法更新_TensorFlow 2.0「开发者预览版」上线,内容每日更新
  10. POJ2528线段树段更新逆序异或(广告牌)