汇编内中断

news2025/7/28 18:44:50

内中断

文章目录

  • 内中断
    • 1.内中断的产生
    • 2.中断处理程序、中断向量表、中断过程
    • 3.iret指令
    • 4.除法错误中断的处理
    • 5.单步中断
    • 6.int指令
    • 7.BIOS和DOS所提供的中断例程


1.内中断的产生

任何一个通用的CPU,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,我们可以称其为:中断信息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息

  1. 中断信息可以来自CPU的内部和外部(内中断,外中断)
  2. 内中断:当CPU的内部有需要处理的事情发生的时候,将产生中断信息,引发中断过程。这种中断信息来自CPU的内部

8086CPU的内中断(下面四种情况将产生中断信息):

  1. 除法错误,比如,执行div指令产生的除法溢出
  2. 单步执行
  3. 执行into指令
  4. 执行int指令

中断信息中包含中断类型码,中断类型码为一个字节型数据,可以表示256种中断信息的来源(中断源)

上述的4种内中断源,在8086CPU中的中断类型码如下:

  1. 除法错误:0
  2. 单步执行:1
  3. 执行into指令:4
  4. 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给CPU的中断类型码

2.中断处理程序、中断向量表、中断过程

中断处理程序:

  1. 用来处理中断信息的程序被称为中断处理程序
  2. 根据CPU的设计,中断类型码的作用就是用来定位中断处理程序。比如CPU根据中断类型码4,就可以找到4号中断的处理程序

中断向量表:

  1. 中断向量就是中断处理程序的入口地址。中断向量表就是中断处理程序入口地址的列表
  2. CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址

请添加图片描述

中断过程:

  1. 中断过程的主要任务就是用中断类型码在中断向量表中找到中断处理程序的入口地址,设置CS和IP
  2. 简要描述如下:
    1. 取得中断类型码N
    2. pushf
    3. TF=0,IF=0 (为什么这样参考单步中断)
    4. push CS , push IP
    5. (IP)=(N * 4),(CS)=(N * 4 + 2)
  3. 硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序

3.iret指令

CPU随时都可能执行中断处理程序,中断处理程序必须一直存储在内存某段空间之中,而中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中

中断处理程序的常规编写步骤:

  1. 保存用到的寄存器
  2. 处理中断
  3. 恢复用到的寄存器
  4. iret指令返回

iret 指令描述为:pop IP pop CS popf

iret指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序


4.除法错误中断的处理

mov ax, 1000h 
mov bh, 1
div bh ;除法溢出错误
  1. 当CPU执行div bh时,发生了除法溢出错误,产生0号中断信息,从而引发中断过程
  2. CPU执行0号中断处理程序
  3. 系统中的0号中断处理程序的功能:显示提示信息“Divide overflow”后,返回到操作系统中

编程实验:编写0号中断处理程序do0,当发生除法溢出时,在屏幕中间显示“overflow!”,返回DOS

实验要求:

  • 0000:0200至0000:02FF的256个字节的空间所对应的中断向量表项都是空的,可以将中断处理程序do0传送到内存0000:0200处
  • 中断处理程序do0放到0000:0200,再将其地址登记在中断向量表对应表项

思路:

  • 0号表项的地址0:00:0字单元存放偏移地址,0:2字单元存放段地址
  • 将do0的段地址0存放在0000:0002字单元中,将偏移地址200H存放在0000:0000字单元
assume cs:code

code segment
start:	
		mov ax, cs
		mov ds, ax
		mov si, offset do0		;设置ds:si指向源地址
		mov ax, 0
		mov es, ax
		mov di, 200h			;设置es:di指向目的地址0000:0200
		mov cx, offset do0end - offset do0		;设置cx为传输长度 编译时给出do0部分代码长度
		cld				        ;设置传输方向为正
		rep movsb ;将do0的代码送入0:200处
		
		mov ax, 0               ;设置中断向量表
		mov es, ax
		mov word ptr es:[0*4], 200h
		mov word ptr es:[0*4+2], 0

      	mov ax,4c00h
      	int 21h

;do0程序的主要任务是显示字符串

do0:	jmp short do0 start 
      	db "overflow!"

do0start:
      	mov ax, cs
      	mov ds, ax
      	mov si, 202h			;设置ds:si指向字符串

      	mov ax, 0b800h
      	mov es, ax
		mov di, 12*160+36*2		;设置es:di指向显存空间的中间位置

        mov cx, 9				;设置cx为字符串长度
	s:	mov al, [si]
      	mov es:[di], al
      	inc si
      	add di, 1
		mov al, 02h             ;设置颜色
		mov es:[di], al        
		add di, 1
      	loop s

      	mov ax, 4c00h
      	int 21h
do0end:	nop

code ends
end start

5.单步中断

  1. CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。单步中断的中断类型码为1
  2. Debug是如何利用CPU所提供的单步中断的功能进行调试?如使用t命令查看寄存器状态
  3. Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令
  4. 在使用t命令执行指令时,Debug将TF设置为1,在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕上,并且等待输入命令
  5. 在进入中断处理程序之前,设置TF=0。从而避免CPU在执行中断处理程序的时候发生单步中断

6.int指令

  1. int指令的格式为:int n ,n为中断类型码,它的功能是引发中断过程
  2. CPU执行int n指令,相当于引发一个n号中断的中断过程
  3. 在程序中使用int指令调用任何一个中断的中断处理程序(中断例程)

编写供应用程序调用的中断例程:

//实验一
;2 * 3456^2
    
assume cs:code

code segment

start: 
     mov ax, 3456 ;(ax)=3456
     int 7ch  ; 调用中断7ch的中断例程,计算ax中的数据的平方
     add ax, ax  
     adc dx, dx  ;存放结果,将结果乘以2

     mov ax,4c00h
     int 21h
code ends
end start 
//实验二
;功能:将一个全是字母,以0结尾的字符串,转化为大写
;参数:ds:si指向字符串的首地址
;应用举例:将data段中的字符串转化为大写
    
assume cs:code

data segment
	db 'conversation',0
data ends

code segment
start:  mov ax, data
		mov ds, ax
		mov si, 0
		int 7ch
		
		mov ax,4c00h
		int 21h
code ends
end start   

7.BIOS和DOS所提供的中断例程

在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统)

BIOS中主要包含以下几部分内容:

  1. 硬件系统的检测和初始化程序
  2. 外部中断和内部中断的中断例程
  3. 用于对硬件设备进行I/O操作的中断例程
  4. 其他和硬件系统相关的中断例程

程序员在编程的时候,可以用int指令直接调用BIOS和DOS系统提供的中断例程,来完成某些工作,和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程

BIOS和DOS中断例程的安装过程:

BIOS和DOS提供的中断例程是如何安装到内存中的呢?

  1. 开机后,CPU一加电,初始化(CS)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序
  2. 初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在
  3. 硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制
  4. DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量

BIOS中断例程应用:

一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序

BIOS和DOS提供的中断例程,都用 ah 来传递内部子程序的编号

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的“al

assume cs:code 

code segment
;int 10h中断例程的"设置光标位置"功能
mov ah, 2;设置光标调用第10h号中断例程的2号子程序,功能为设置光标位置(可以提供光标所在的行号、列号和页号作为参数)

;设置光标到第0页,第5行,第12列
mov bh, 0;第0页
mov dh, 5;dh中放行号
mov dl, 12;dl中放列号
int 10h

;int10h中断例程的"在光标位置显示字符"功能。
mov ah,9 ;调用第10h号中断例程的9号子程序,功能为在光标位置显示字符
;提供要显示的字符、颜色属性、页号、字符重复个数作为参数
mov al,'a'  ;字符
mov b1,11001010b  ;颜色属性
mov bh,0  ;0页
mov cx,3  ;字符重复个数
int 10h

code ends 
end
  1. bh中页号的含义:内存地址空间中,B8000H~BFFFFH共32kB的空间,为80*25彩色字符模式的显示缓冲区
  2. 一屏的内容在显示缓冲区中共占4000个字节。显示缓冲区分为8页,每页4KB(约4000B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说,通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上

DOS中断例程应用:

int 21h中断例程是DOS提供的中断例程,4ch号功能,即程序返回功能

mov ah, 4ch ;调用第21h号中断例程的4ch号子程序,功能为程序返回,可以提供返回值作为参数
mov al, 0 ;返回值
int 21h

编程:在屏幕的5行12列显示字符串“Welcome to masm!”

assume cs:code 
 
data segment 
	db	'Welcome to masm',  '$'     ;“$”本身并不显示,只起到边界的作用
data ends 

code segment
start:	mov ah, 2 ;10号中断设置光标位置功能
		mov bh, 0 ;0页
		mov dh, 5;dh中放行号
		mov dl, 12 ;dl中放列号
		int 10h 
		
		mov ax, data 
		mov ds, ax 
		mov dx, 0 ;ds:dx指向字符串的首地址data:0  (参数)
		mov ah, 9 ;调用第21h号中断例程的9号子程序,功能为在光标位置显示字符串,可以提供要显示字符串的地址作为参数
		int 21h 
		
		mov ax, 4c00h ;21号中断程序返回功能
		int 21h 
code ends
end start

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

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

相关文章

StartDT奇点云通过CMMI5全球软件领域最高级别成熟度认证

近日,奇点云正式通过全球软件领域最高级别认证——CMMI 5级认证,标志着奇点云的软件技术研发能力、项目管理能力、质量保障能力、方案交付能力等均达到优化管理级的国际先进水平。 CMMI(软件能力成熟度模型集成)是国际上用于评价软…

JAVA开发(Redis的使用, redis数据类型)

Redis是一个缓存型数据库,或者平时就叫它缓存。它支持存储的类型有以下几种: string(字符串) hash(哈希) list(列表) set(集合) zset(sorted set:…

智慧电网解决方案-最新全套文件

智慧电网解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧电网全套最新解决方案合集一、建设背景 电力公司如今面临的紧迫需求问题似乎无穷无尽,例如:提高可靠性;降低成本;提高效率;满足环…

(十)C++中的左值lvalue右值rvaue

文章目录1.C中的变量名是如何存储及引用2.C中的左值与右值3.右值引用4.移动语义move函数参考文献欢迎访问个人网络日志🌹🌹知行空间🌹🌹 1.C中的变量名是如何存储及引用 int a 0;如上,在C中声明一个变量时&#xff0…

【0143】 System V共享内存(Shared Memory)

文章目录 1. 共享内存1.1 共享内存分类2. System V IPC密钥3. System V 共享内存调用3.1 shmget()3.2 shmat()3.3 shmdt()3.4 shmctl()4. 实战演练4.1 服务端程序代码实现4.2 客户端程序代码实现1. 共享内存 共享内存是 Linux 和其他类 Unix 系统下可用的三种进程间通信 (IPC)…

Docker下安装Zookeeper以及Kafka

一、安装Zookeeper 1. 查看Zookeeper镜像以及版本 访问Zookeeper镜像库地址 也可以通过命令docker search zookpper在命令行搜索zookeeper镜像,但是通过该命令无法查看远程镜像版本信息。 NAME:镜像名(镜像仓库源的名称) DESCRIPTION:对该镜…

yolov5剪枝实战2:网络剪枝原理介绍

1. 网络轻量化相关技术 网络轻量化的相关技术分类:1. 网络剪枝(Network pruning) 2. 稀疏表示(Sparse representation) 3. Bits precision(低比特表示,比如不用浮点型,使用int量化) 4. Kownledge distillation(知识蒸馏) 2. 网络剪枝 神经网络一般都是over-parameterized,…

SharePoint Integrator Delphi版

SharePoint Integrator Delphi版 SharePoint Integrator包含易于使用的组件,用于连接流行的SharePoint Server结构,如网站、列表和文档。SharePoint Integrator组件支持对SharePoint对象的访问,允许应用程序轻松地查询和修改列表、访问托管文…

京东发布第三季度财报员工总数近50万 “以实助实”助力高质量就业

11月18日,京东集团(纳斯达克股票代码:JD,港交所股票代号:9618)发布了2022年三季度业绩。其中净收入为2435亿元人民币,同比增速高于同期国内社会消费品零售总额3.5%的增速;其中&#…

【17-微服务网关之Spring Cloud GatewaySpring Cloud Gateway网关服务搭建】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

“知识图谱补全”术语:知识图谱补全、三元组分类、链接预测

基本简介: 知识图谱补全通常定义为“三元组分类”或“链接预测”任务。首先,一条知识在知识图谱中通常由三元组表示:“头实体,关系,尾实体”。三元组分类即对于给定的三元组,预测其正确的概率。而链接预测…

VM虚拟机卡顿、闪退一系列问题与卸载重装问题(详细版)

最新发现好多虚拟机有闪退现象,对此我给出一系列解决方案,仅供参考 一.软件问题 1.虚拟机闪退 首先,如果是VMware Workstation Pro也就是软件本身闪退问题,即还没有运行或打开系统时就已经闪退,说明软件有问题&…

Windows系统VirtualBox下载与安装

Windows系统VirtualBox下载与安装 一、下载:https://www.virtualbox.org/wiki/Downloads 1.安装包 2.扩展包(对USB 2.0、USB 3.0、远程桌面协议 VRDP等实用功能的支持) 二、安装 1.如果安装出现本机缺少必要包的情况,不要慌&am…

3.1版本【HarmonyOS 第一课】正式上线!参与学习赢官方好礼>>

【课程介绍】《HarmonyOS第一课》是跟随版本迭代不断推出的系列化课程,本期课程基于HarmonyOS 3.1版本的新技术和特性,每个课程单元里面都包含视频、Codelab、文章和习题,帮助您快速掌握HarmonyOS的应用开发,快速了解新的特性和技…

基于PHP+MySQL汽车展览会网站的设计与实现

随着我国经济的发展,汽车已经进入了家家户户,但是很多时候人们因为各种原因需要进行汽车出行,但是很多时候人们有不知道购买什么样的汽车更适合自己,如果挨个去汽车4S既浪费时间又不能够把各类汽车都看全,人们更希望通过发达的车展来查询自己所需的汽车信息,本系统也是出于这样…

分享几个常用的可以从外部攻击视角发现甲方公司安全问题的开源工具

资产管理平台-ARL https://github.com/TophantTechnology/ARL 作为甲方,一定要有自己的资产平台,主要目的就是基于外部攻击视角不断发现风险,当然放在内网也可以,测试了很多开源的工具,最终还是选择了ARL,…

【深入理解C++】左值引用、常引用、右值引用、std::move()函数

文章目录1.左值引用2.常引用2.1 const引用可以指向临时数据2.2 const引用可以指向不同类型的数据2.3 const引用作为函数参数3.右值引用4.std::move()函数1.左值引用 左值引用只能绑定到左值上,不能绑定到右值上。 左值引用不能绑定到临时变量上,因为临…

是德N5290A矢量网络分析仪技术参数及操作步骤

网络分析仪能对被测量器件(主要分为有源元件和无源元件)的线性和非线性特性(幅频特性,相频特性,时频特性,功率频率特性等)进行表征。 那么大家真的了解网络分析仪吗?下面西安安泰测试以是德科技(安捷伦)E50系列矢量网络分析仪为例介绍仪器基…

基于PHP+MySQL汽车租赁管理系统的设计与实现

虽然汽车已经进入了家家户户,但是很多时候人们因为各种原因需要进行汽车的租赁,可能是到达的城市比较远,也可能是经济实力不允许,或者是对车辆的要求不高,暂时没必要买车等,这些特殊的原因导致了汽车租赁行业的兴起。越来越多的用车用户希望通过租赁来直接获取使用的使用权,这样…

四、C++ 类的继承

文章目录一、引言1.1 类成员的三种类型1.2 访问控制和继承二、类的继承2.1 格式2.2 继承类型三、多继承一、引言 1.1 类成员的三种类型 我们知道,在类中一共有三种类型,分别为public,private和protected,默认为private&#xff…