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

2023-11-11

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

      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:code
	code segment
 start: mov ax,cs
		mov ds,ax
		mov si,offset s0
		mov ax,0
		mov es,ax
		mov di,200h
		cld
		mov cx,offset s0end-offset s0
		rep movsb			安装中断处理程序到0000:0200处

		mov ax,0
		mov ds,ax
		mov word ptr [0*4],200h
		mov word ptr [0*4+2],0		更改中断向量表

		mov ax,4x00h
		int 21h

	s0: jmp short st
		db "divide error!"
	st: mov ax,cs
		mov ds,ax
		mov si,202h
		mov ax,0b800h
		mov es,ax
		mov di,12*160+32*2
		mov cx,13
	lo: mov al,[si]
		mov es:[di],al
		inc si
		add di,2
		loop lo
		
		mov ax,4c00h
		int 21h  
  s0end:nop				中断处理程序
	code ends
	end start

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 汇编语言Assembly Language

    想念wangfeng老师 xff0c 他将深奥的汇编语言解析的是那么透彻明白 xff0c 身为学生的我真的受益良多 字符 十六进制ASCII 0 9 30h 39h A Z 41h 5ah a z 61h 7ah 逻辑运算 xff1a 与
  • 汇编语言32位加减乘除运算题

    用16位指令编制程序 xff0c 处理32位的加减乘除算术四则运算题 本文计算 xff08 3 X 43 Y Z xff09 5的值 值分别为 xff1a span class hljs built in x span dw span cl
  • 阿尔法点亮LED灯(一)汇编语言

    文章目录 前言一 GPIO介绍1 MX6U IO 复用2 MX6U IO 配置3 GPIO 配置4 GPIO 时钟使能5 61 61 GPIO的使用步骤 61 61 二 程序编写1 使能 GPIO1 时钟2 设置 GPIO1 IO03 的复
  • 汇编语言,数据段中,标号前面加不加offset有什么区别?

    data segment string db 40h dup 0 string 1 db 39 Input characters 39 0dh 39 39 data ends 那么 xff0c mov bx string 和 mov bx
  • LLVM汇编语言指导手册之指令手册

    下面是我对llvm汇编中一些不常用的指令的总结 shl 指令 语法
  • 汇编:将表格写入到指定内存空间

    代码如下 assume cs code ds data es table ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985
  • 汇编视角分析C++虚函数实现原理

    1 概述 虚函数是c 语言非常重要的机制 日常的c 编程工作中经常使用虚函数 通过汇编视角来探究虚函数的实现原理 有助于深刻理解虚函数的内部机制 尤其要说明的是 c 语法规范并没有规定虚函数的具体实现方案 不同的编译器实现方式可以不同 本文
  • arm/arm64函数栈帧(stackframe)结构和传参规则

    1 概述和问题 本文汇编代码的平台及编译器 arm gcc 分析函数调用栈的规则对于理解程序运行基本原理很有帮助 汇编代码分析crash问题也大有裨益 本文示例代码通过C语言函数调用一个汇编函数 再从汇编函数跳转回C函数 分析该示例的汇编代
  • [从零学习汇编语言] - 标志寄存器

    文章目录 前言 一 标志寄存器的简介 二 标志位详解 2 1 ZF标志 2 2 PF标志 2 3 SF标志 2 4 CF标志 2 4 1 无符号运算 2 4 2 有符号运算 2 5 OF标志 2 5 1 CF标志及OF标志的区别 2 6 D
  • 汇编语言数据处理长度(X ptr指令解析)

    文章目录 1 通过寄存器名指明要处理的数据的尺寸 2 在没有寄存器名存在的情况下 用操作符 X ptr 指明内存单元的长度 X在汇编指令中可以为byte word或dword 3 其他方法 8086CPU的指令 可以处理两种尺寸的数据 by
  • CPU的标志寄存器

    1 ZF 零标志位 执行指令后结果为0 ZF 1 否则ZF 0 2 PF 奇偶标识位 它记录相关指令执行后 其结果的所有二进制位中1的个数是否为偶数 如果是偶数 PF 1 否则PF 1 3 SF 符号标识位 它记录相关指令执行后 其结果是否
  • 汇编基础知识

    一 汇编语法 1 GNU 汇编语法适用于所有的架构 并不是 ARM 独享的 GNU 汇编由一系列的语句组成 每行一条语句 每条语句有三个可选部分 如下 label instruction comment label 即标号 表示地址位置 有
  • 用汇编语言实现从键盘输入一个字符,输出其对应的ASCII码

    Hello 大家好呀 这是本人的第一篇博客 这学期正好在学汇编语言 上周老师布置了一个作业 用汇编语言实现从键盘输入一个字符 输出其对应的ASCII码 说实话 这个问题最开始的时候令我不知从何下手 明明用c语言只需要几行代码 用汇编来实现却
  • 在dos下使用debug被提示incorrect ms dos version的解决办法

    原创 在dos下使用debug被提示incorrect ms dos version的解决办法 首先可以确定一点 直接使用debug时它是直接在当前目录下寻找的 一旦当前目录下没有debug或debug版本不合适 则会出错 直接在 开始 中
  • Ubuntu/Linux下安装DosBox配置汇编环境

    Ubuntu Linux下安装DosBox配置汇编环境 微信关注公众号 夜寒信息 致力于为每一位用户免费提供更优质技术帮助与资源供给 感谢支持 一 首先我们去DosBox官网下载DosBox 0 73 或者直接启用终端命令行输入以下代码 s
  • VC6++配置汇编环境和第一个简单程序

    准备工作 1 下载并安装VC6 软件 2 下载Irvine32 lib库以及相关文件 Intel 汇编语言程序设计 irvine lib文件内 3 下载ml exe和ml err文件 ml from masm32文件内 以上准备工作的文件均
  • 汇编语言 第3版 王爽 检测点答案及详细解析

    第一章 基础知识 检测点1 1 1 1个CPU的寻址能力为8KB 那么它的地址总线的宽度为 13位 2 1KB的存储器有 1024 个存储单元 存储单元的编号从 0 到 1023 3 1KB的存储器可以存储 8192 2 13 个bit 1
  • [从零学习汇编语言] - BX寄存器与loop指令

    文章目录 前言 一 Bx寄存器与 偏移地址 二 loop指令与jmp指令 1 jmp指令 2 loop指令 三 一些奇奇怪怪的注意点 1 汇编源程序的数字问题 2 Debug和Masm的区别 1 mov ax 0 问题 3 段前缀 四 课后
  • 汇编:表格显示(含多个子程序)

    代码如下 assume cs code data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1
  • 代码段中存放数据

    1 前面我们写的程序中 只有一个代码段 我们先来在代码段中使用数据 看看和单独一个数据段存放数据有什么差别 考虑这样一个问题 编程计算以下8个数据的和 结果存放在ax寄存器中 0123H 0456H 0789H 0abcH 0defH 0f

随机推荐

  • 若依框架前后端分离版——导入功能

    引言 主要是记录自己使用若依框架并增加其导入功能的实现过程 前端部分 在相应的index vue中添加以下代码 1 数据导入的按钮 v hasPermi 是权限相关的配置
  • Git版本回退并提交远程

    1 进入远程git 在提交纪录中找到需要回退的版本 复制版本号 2 终端进入项目 并执行git reset hard 23a50a1fXXX41XXXXX0227 3 把修改推送至远程 执行已下指令 git push f u origin
  • thrift开发问题总结

    作为目前最流行的RPC框架 thrift不仅提供了通信协议 同时提供了网络框架 解脱了程序员的生产力 thrift也是阿帕奇Hadoop系列的RPC实现工具 本文主要聚焦在实现的thrift系统中 遇到的各种问题 但是thrift在隐藏一些
  • matlab 矩阵增加行,MATLAB 中 如何在矩阵中插入1行

    点击查看MATLAB 中 如何在矩阵中插入1行具体信息 答 举例来说吧假如你已有矩阵A如下 A 2 3 5 3 4 1 0 9 7 这是一个3 3矩阵 那么当你想插入一行r 1 2 3 时 那么可以这样做 A A r 这样A就变成了4 3的
  • Gin框架(学习笔记)

    目录 学习地址 gin 路由 routes group gin 中间件 Cookie 重定向 同步异步 日志文件 学习地址 https www topgoer com gin E6 A1 86 E6 9E B6 gin 路由 package
  • windows操作系统蓝屏错误对照表

    windows操作系统蓝屏错误对照表
  • 出行行业计价模块的设计模式实践

    业务场景介绍 在出行行业中 价格的配置随随着业务的增加而增加 而刺激出行的促销活动更是频繁 在价格的计算中 通常的流程如下 根据一组价格配置 计算订单基础的价格 根据用户拥有的优惠对象 例如优惠券 积分 会员级别等 计算出优惠以后的价格 计
  • 信号和槽机制

    1 信号和槽机制概念 信号 各种事件 槽 响应信号的动作 当某个事件发生后 如某个按钮被点击了一下 它就会发出一个被点击的信号 signal 某个对象接收到这个信号之后 就会做一些相关的处理动作 称为槽slot 但是Qt对象不会无故收到某个
  • pyqt5 一些界面色彩搭配的建议(RGB值)

    简约现代风格 底色 浅灰色 240 240 240 按钮控件颜色 中蓝色 0 122 255 文字框颜色 白色 255 255 255 字体颜色 深灰色 51 51 51 点击时的颜色 深蓝色 0 80 180 清新自然风格 底色 浅绿色
  • React中styled-components的使用(样式组件库)

    一 官网地址 https www styled components com 二 styled components 1 styled components 样式化组件 主要作用是它可以编写实际的CSS代码来设计组件样式 也不需要组件和样式
  • React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快

    一次性加载太多的路由文件会使首次加载的速度很慢 所以我们需要将路由搞成懒加载的形式 用到哪个组件加载哪个组件 庆幸的是React官方已经给我们准备好了插件 也在React库中 首先 从react这个库中导出lazy Suspense这两个方
  • mysql数据库的内部结构说明

    记住 表才是存放数据的基本单元 结论 Mysql数据底层由多个database组成 每一个database存放多张表
  • 【记录】在NAS上部署git文章汇总(网址)

    1 https blog csdn net mtclz3 article details 87461470 2 https blog csdn net u014213012 article details 65631261 3 https
  • git常用操作命令总结

    本篇文章主要收集记录git常用命令
  • Keil编程中Source Brower : "P17" is undefined!的问题

    博客原文 Keil编程中Source Brower P17 is undefined 的问题 在Keil新建工程中经常会遇到一个问题 去看某一个变量定义 然后跳转不过去 并提示Source Brower 某某 is undefined 在这
  • 嵌入式VSCode+gdbserver图形化调试环境搭建与使用

    目录 一 原理 二 环境搭建 1 VSCode设置 2 gdbserver安装 三 调试过程 一 原理 嵌入式系统中一般在 PC端运行 gdb工具 源码也是在 PC端 源码对应的可执行文件放到开发板中运行 为此我们需要在开发板中运行 gdb
  • 数据库分库分表

    一 为什么要分库分表 如果一个网站业务快速发展 那这个网站流量也会增加 数据的压力也会随之而来 比如电商系统来说双十一大促对订单数据压力很大 Tps十几万并发量 如果传统的架构 一主多从 主库容量肯定无法满足这么高的Tps 业务越来越大 单
  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • 七. Kubernetes Objects对象,对象状态与yaml

    目录 一 基础概念理解 二 k8s 对象中的spec与status 三 如何编写yaml 一 基础概念理解 Kubernetes Objects 官方地址 在k8s中所有操作资源实体都可以称为对象 先下图中的这些 都可以称为对象 不同对象功
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码