当前位置: 首页 > news >正文

汇编语言(王爽)-第十二章

第十二章 内中断
*四种引发内中断的情况
(1)除法错误,如溢出;对应中断类型码0
(2)单步执行;对应中断类型码1
(3)into指令;对应中断类型码4
(4)int N;对应中断类型码N
*中断向量表
当引发内中断时候,cpu转入执行相应中断程序,而各类中断类型码对应的中断程序固化存于内存中;这就需要通过不同的中断类型码以获取其对应的
中断程序的入口地址,即有了中断向量表。
中断向量表固化于0000:0000~03ffh内存段中;
中断类型码n:对应中断程序的入口地址为:段地址0000:(4n+2),偏移地址0000:(4n).
*中断过程
-----中断开始------
(1)响应中断,取得中断类型码n
(2)pushf
(3)TF=0,IF=0
(4)push cs,push ip
(5)cs=(0000:(4n+2)),ip=(0000:(4n));
(6)执行中断程序
(7)iret 返回<iret指令实际是在中断程序中的>
-------中断结束----------
*中断程序的编写、安装
(1)编写中断程序X
(2)安装中断程序X(一般来说,小型中断程序可放于0000:200~2ffh中,该段是空闲的)
(3)修改中断向量表,使中断类型码对应该中断程序入口
程序框架:
assume cs:codesg
codesg segment
  start: 安装X的代码
           设置中断向量表
           mov ax,4c00h
           int 21h
       X:
            ....
            mov ax,4c00h
            int 21h
      Xend:
            nop           ;空执行语句,以便计算X的代码长度确定安装空间即loop次数
codesg ends
end start
?1、不难发现,上述程序框架中X代码中返回的指令用的是mov ax,4c00h/int 21h;而之前提过需要用iret来进行返回。这里是怎么回事呢?细想一下:其实两个返回是需要根据情况来使用的,对于除法溢出,其返回的目标是dos,所以需要用mov ax,4c00h/int 21h,而其他一些返回的目标是触发中断的原程序,则需要用iret。
?2、关于书中所提对于除法溢出中断处理程序用到的字符串"overflow!'的存储。书中采用的方法是:
do0:jmp short do0start
       db "overflow!"
do0start:
        .....
         mov ax,4c00h
         int 21h
do0end:nop
这样的话,字符串overflow!被固化在内存中,就不会被改变了。而jmp short do0start这句的作用是使ip跳转至中断程序的实际上的第一句,书上的解释是"overflow!"并不是可执行的代码。而我个人的看法,更合适的解释是,如果没有jmp语句,顺序执行到'overflow!'处会将其看成指令,从而产生错误。
*单步中断
单步中断的类型码为1,其触发的条件是单步中断标志位TF=1;即:
若探测到TF=1,则触发单步中断,类型码为1,转而执行单步中断处理程序,执行其第一个语句;再次探测到TF=1,从而产生无限循环。这也就是为什么在中断处理过程中在pushf后需要将TF设置为0的原因。
*响应中断的特殊情况
在对栈寄存器ss赋值后,即便产生中断,也不会响应,而是继续设置完成sp栈顶值。
假设SS赋值后,响应中断,则取得中断类型码,pushf,TF=IF=0,push cs,push ip...此时这些push操作所用的栈的段地址为ss,而sp呢?未设置,则不是期待中的位置,可能会引起错误。所以对ss和sp的赋值是必须连续的。

转载于:https://www.cnblogs.com/tsembrace/p/3305646.html

相关文章:

  • 小酌重构系列[7]——使用委派代替继承
  • Build Web Apps in Node and Express视频下载
  • Android读取Excel文件
  • 微信公众平台开发文摘
  • AC Again hdoj 1582 搜索
  • 单一职责原则
  • 消息传递系统
  • 简单的SocketExample
  • jQuery 定位到页面具体位置
  • mysql-proxy 实现读写分离
  • WebService之Axis2快速入门(7): Spring与axis整合发布为WebServic
  • backtrack学习之路之metasploit的安装过程
  • Property Animation框架详解(一)
  • 导出was已部署的ear包的几种方法
  • Eclipse 创建Maven工程
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • create-react-app做的留言板
  • ES10 特性的完整指南
  • ES6之路之模块详解
  • HTTP请求重发
  • JDK9: 集成 Jshell 和 Maven 项目.
  • MaxCompute访问TableStore(OTS) 数据
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • RxJS: 简单入门
  • SpingCloudBus整合RabbitMQ
  • Vue官网教程学习过程中值得记录的一些事情
  • windows下使用nginx调试简介
  • 开源SQL-on-Hadoop系统一览
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • HanLP分词命名实体提取详解
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​插件化DPI在商用WIFI中的价值
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (vue)页面文件上传获取:action地址
  • (简单) HDU 2612 Find a way,BFS。
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (一)基于IDEA的JAVA基础1
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net CHARTING图表控件下载地址
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 的程序集加载上下文
  • .net 反编译_.net反编译的相关问题
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net和php怎么连接,php和apache之间如何连接
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .net与java建立WebService再互相调用
  • .NET正则基础之——正则委托
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @EnableAsync和@Async开始异步任务支持