汇编--int指令

中断信息可以来自CPU的内部和外部, 当CPU的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在http://t.csdn.cn/jihpG,我们讲解了中断过程和两种内中断的处理。
这一章中, 我们讲解另一种重要的内中断, 由int指令引发的中断。
int指令
int指令的格式为:int n
n为中断类型码, 它的功能是引发中断过程。
CPU执行int n指令, 相当于引发一个n号中断的中断过程, 执行过程如下:
(1)取中断类型码n;
(2)标志寄存器入栈,IF=0,TF=0;
(3)CS、IP入栈;
(4)(IP)=(n*4),(CS)=(n*4+2)
可以在程序中使用int指令调用任何一个中断的中断处理程序。例如, 下面的程序:
这个程序在DOS方式下执行时, 将在屏幕中间显示一个“!”,然后显示“Divide overflow”后返回到系统中。“!”是我们编程显示的, 而“Divide overflow”是哪里来的呢?我们的程序中又没有做除法, 不可能产生除法溢出。
程序是没有做除法, 但是在结尾使用了int 0指令。CPU执行int 0指令时, 将引发中断过程, 执行0号中断处理程序, 而系统设置的0号中断处理程序的功能是显示“Divide overflow”, 然后返回到系统。
一般情况下,系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。我们在编程的时候, 可以用int指令调用这些子程序。当然, 也可以自己编写一些中断处理程序供别人使用。以后,我们可以将中断处理程序简称为中断例程。
编写供应用程序调用的中断例程
前面,我们已经编写过中断0的中断例程了,现在我们讨论可以供应用程序调用的中断例程的编写方法。下面通过两个问题来讨论。
问题一:编写、安装中断7ch的中断例程。
功能:求一word型数据的平方。
参数:(ax)=要计算的数据。
返回值:dx、ax中存放结果的高16位和低16位。
应用举例:求:2*3456^2。
分析一下,我们要做以下3部分工作。
(1)编写实现求平方功能的程序;
(2)安装程序,将其安装在0:200处;
(3)设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程。
安装程序如下:
assume cs:codecode segment start: ;安装sqr程序mov ax,cs mov ds,axmov si,offset sqr ;设置ds:si指向源地址mov ax,0mov es,ax mov di,200h ;设置es:di指向目的地址mov cx,offset sqrend-offset sqr ;设置cx为传输长度cld ;设置传输方向为正rep movsb;设置中断向量表mov ax,0mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0mov ax,4c00h int 21hsqr:mul ax ;求平方iretsqrend:nopcode ends
end start
注意, 在中断例程sqr的最后, 要使用iret指令。
用汇编语法描述, iret指令的功:
pop IP
pop cs
popf
CPU执行int 7ch指令进入中断例程之前, 标志寄存器、当前的CS和IP被压入栈中, 在执行完中断例程后, 应该用iret指令恢复int 7ch执行前的标志寄存器和CS、IP的值,从而接着执行应用程序。
int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路。
对int、iret和栈的深入理解
问题:用7ch中断例程完成loop指令的功能。
loop s的执行需要两个信息, 循环次数和到s的位移, 所以, 7ch中断例程要完成loop指令的功能, 也需要这两个信息作为参数。我们用cx存放循环次数, 用bx存放位移。
应用举例:在屏幕中间显示80个‘!’
assume cs:codecode segment start: ;mov ax,0b800h mov es,axmov di,160*12+0mov bx,offset s-offset se ;计算从标号s到标号se的转移位移mov cx,80s:mov byte ptr es:[di], '!'add di,2int 7ch ;如果(cx)≠0,转移到标号s处,就是完成loop s的功能se:nopmov ax,4c00h int 21hcode ends
end start
在上面的程序中, 用int 7ch调用7ch中断例程进行转移, 用bx传递转移的位移。
分析:为了模拟loop指令, 7ch中断例程应具备下面的功能:
(1)dec cx;
(2)如果(cx)≠0,转到标号s处执行,否则向下执行。
下面我们分析7ch中断例程如何实现到目的地址的转移。
(1)转到标号s显然应设(CS)=标号s的段地址,(IP)=标号s的偏移地址。
(2)那么,中断例程如何得到标号s的段地址和偏移地址呢?
int 7ch引发中断过程后, 进入7ch中断例程, 在中断过程中, 当前的标志寄存器、CS和IP都要压栈,此时压入的CS和IP中的内容,分别是调用程序的段地址(可以认为是标号s的段地址) 和int 7ch后一条指令的偏移地址(即标号se的偏移地址) 。
可见,在中断例程中,可以从栈里取得标号s的段地址和标号se的偏移地址,而用标号se的偏移地址加上bx中存放的转移位移就可以得到标号s的偏移地址。
(3)现在知道,可以从栈中直接和间接地得到标号s的段地址和偏移地址,那么如何用它们设置CS:IP呢?
可以利用iret指令, 我们将栈中的se的偏移地址加上bx中的转移位移, 则栈中的se 的偏移地址就变为了s的偏移地址。我们再使用iret指令, 用栈中的内容设置CS、IP, 从而实现转移到标号s处。
7ch中断例程如下。
lp:push bp mov bp,sp dec cx jcxz lpret ;cx=0就转移add[bp+2],bx ;产生中断时,pushf push cs push ip,进入中断程序后又push bp;(bp+2)就是se标号ip;(bp+2)加上位移bx就是s的偏移地址;之后iret过程中pop ip获取的就是s的偏移地址lpret:pop bp iret
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中断例程的应用。
int 10h中断例程是BIOS提供的中断例程, 其中包含了多个和屏幕输出相关的子程序。
一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。BIOS和DOS提供的中断例程, 都用ah来传递内部子程序的编号。
下面看一下int 10h中断例程的设置光标位置功能。
(ah)=2表示调用第10h号中断例程的2号子程序,功能为设置光标位置,可以提供光标所在的行号(80*25字符模式下:0~24)、列号(80*25字符模式下:0~79),和页号作为参数。
bh中页号的含义:内存地址空间中, B8000H~B FFFFH共32kB的空间, 为80*25彩色字符模式的显示缓冲区。一屏的内容在显示缓冲区中共占4000个字节。
显示缓冲区分为8页,每页4KB(~4000B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说,通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上。
再看一下int10h中断例程的在光标位置显示字符功能。
(ah)=9表示调用第10h号中断例程的9号子程序,功能为在光标位置显示字符,可以提供要显示的字符、颜色属性、页号、字符重复个数作为参数。
bl中的颜色属性的格式如下。

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的'a'。
注意,闪烁的效果必须在全屏DOS方式下才能看到。
DOS中断例程应用
int 21h中断例程是DOS提供的中断例程, 其中包含了DOS提供给程序员在编程时调用的子程序。
我们前面一直使用的是int 21h中断例程的4ch号功能, 即程序返回功能, 如下:
mov ah,4ch ;程序返回
mov al,0 ;返回值
int 21h
(ah)=4ch表示调用第21h号中断例程的4ch号子程序,功能为程序返回,可以提供返回值作为参数。我们前面使用这个功能的时候经常写做:
mov ax,4c00h
int 21h
我们看一下int 21h中断例程在光标位置显示字符串的功能:
ds:dx ;指向字符串,要显示的字符串需用"$"作为结束符
mov ah,9;功能号9,表示在光标位置显示字符串
int 21h
(ah)=9表示调用第21h号中断例程的9号子程序,功能为在光标位置显示字符串,可以提供要显示字符串的地址作为参数。
上述程序在屏幕的5行12列显示字符串“Welcome to masm!”, 直到遇见“$”(“$”本身并不显示,只起到边界的作用)。
如果字符串比较长,遇到行尾,程序会自动转到下一行开头处继续显示;如果到了最后一行,还能自动上卷一行。
实验:



相关文章:
汇编--int指令
中断信息可以来自CPU的内部和外部, 当CPU的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在http://t.csdn.cn/jihpG,我们讲解了中断过程和两种内中断的处理。 这一章中, 我们讲解另一种…...
生成式AI的JavScript技术栈
如果不使用新的软件基础设施技术,就很难理解它们。 至少,a16z 基础设施团队发现了这一点,而且因为我们中的许多人都是以程序员的身份开始职业生涯的,所以我们经常通过实践来学习。 尤其是生成式AI浪潮的情况尤其如此,它…...
从零开始学习软件测试-第39天笔记
接口测试 http消息结构 请求报文 请求行 请求方式 url 协议版本请求头空行请求体响应报文 响应行 协议版本 状态码 状态消息响应头空行响应体 请求参数类型 path参数 写在路径中的 https://xxx.xxx.com/参数值query参数 写在url问号后面,以键值对形式存在 h…...
【多思路附源码】2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策
赛题介绍 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬…...
Vue2+Vue3基础入门到实战项目(六)——课程学习笔记
镇贴!!! day07 vuex的基本认知 使用场景 某个状态 在 很多个组件 来使用 (个人信息) 多个组件 共同维护 一份数据 (购物车) 构建多组件共享的数据环境 1.创建项目 vue create vuex-demo 2.创建三个组件, 目录如下 |-components |--Son1.…...
QT—基于http协议的网络文件下载
1.常用到的类 QNetworkAccessManager类用于协调网络操作,负责发送网络请求,创建网络响应 QNetworkReply类表示网络请求的响应。在QNetworkAccessManager发送一个网络请求后创建一个网络响应。它提供了以下信号: finished():完成…...
SpringBoot-配置优先级
配置 SpringBoot项目支持的三种格式的配置文件 application.properties:这是最常用的配置文件类型,使用键值对的形式来配置应用程序的属性。可以在该文件中配置应用程序的端口号、数据库连接信息、日志级别等。 application.yml:这是一种更…...
科普初步了解大模型
目录 一、大模型的简单认知 (一)官方定义 (二)聚焦到大语言模型 (三)大模型的应用举例 二、如何得到大模型 (一)整体的一般步骤 训练自己的模型 使用预训练模型 选择适当的…...
Nginx 和 网关的关系是什么
分析&回答 Nginx也可以实现网关,可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等。网关功能可以进行扩展,比如:安全控制,统一异常处理,XXS,SQL注入等;权限控制,黑白名…...
解决springboot项目中的groupId、package或路径的混淆问题
对于像我一样喜欢跳跃着学习的聪明人来说,肯定要学springboot,什么sevlet、maven、java基础,都太老土了,用不到就不学。所以古代的聪明人有句话叫“书到用时方恨少”,测试开源项目时,编译总是报错ÿ…...
Vmware 网络恢复断网和连接
如果你的 虚拟机无法联网了,比如: vmware 无法将网络更改为桥接状态: 没有未桥接的主机网络适配器 等各种稀奇古怪的问题; 按照下面操作 还远默认设置 包你解决各种问题!...
学生来看!如何白嫖内网穿透?点进来!
文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1 搭建虚拟机1.1 下载文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压虚拟机文件1.4 虚拟机初始化1.5 没有搜索到解决方式:1.6 虚…...
C++中的stack和queue
文章目录 1. stack的介绍和使用1.1 stack的介绍1.2 stack的使用 2. queue的介绍和使用2.1 queue的介绍2.2 queue的使用 3 priority_queue的介绍和使用3.1 priority_queue的介绍3.2 priority_queue的使用 4. 容器适配器4.1 什么是适配器4.2 STL标准库中stack和queue的底层结构4.…...
Ubuntu-22.04通过RDP协议连接远程桌面
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、RDP是什么?二、配置1.打开远程桌面功能2.验证服务3.防火墙配置4.测试效果 总结 前言 由于一些特殊需要,我需要通过远程桌面连接到U…...
20230908java面经整理
1.cpp和java的区别 cpp可以多重继承,对表java中的实现多个接口 cpp支持运算符重载、goto、默认函数参数 cpp自动强转,导致不安全;java必须显式强转 java提供垃圾回收机制,自动管理内存分配,当gc要释放无用对象时调用f…...
uniapp 开发App 网络异常如何处理
我对该问题思考的不是很清楚,目前只想到了基本的解决方案 第一、客户端的网络异常(断网) 1. 断网情况 一定要弹出信息提示,目前最好的解决方式就是在uni.request封装的统一方法中写提示 //1. 封装的网络请求 async function se…...
docker安装常用软件
Linux系统安装docker请参考:https://mp.csdn.net/mp_blog/creation/editor/128176825 docker安装mysql 1、拉镜像:docker pull mysql:8.0.26 2、创建数据目录: mkdir -p /mnt/data/mysql/data mkdir -p /mnt/data/mysql/logs mkdir -p /mn…...
CocosCreator3.8研究笔记(五)CocosCreator 脚本说明及使用(下)
在Cocos Creator中,脚本代码文件分为模块和插件两种方式: 模块一般就是项目的脚本,包含项目中创建的代码、引擎模块、第三方模块。 插件脚本,是指从 Cocos Creator 属性检查器中导入的插件,一般是引入第三方引入库文件…...
Adobe Acrobat Reader界面改版 - 解决方案
问题 日期:2023年9月 Adobe Acrobat Reader下文简称Adobe PDF Reader,此软件会自动进行更新,当版本更新至2023.003.20284版本后。 软件UI界面会大改版:书签页变成了右边、工具栏变到了左边、缩放按钮变到了右下角,如…...
实用调试技巧(2)
文章目录 6. 如何写出好(易于调试)的代码6.1 优秀的代码:6.2 示范:6.3 const的作用 7. 编程常见的错误7.1 编译型错误7.2 链接型错误7.3 运行时错误 附: 6. 如何写出好(易于调试)的代码 6.1 优…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
云原生时代的系统设计:架构转型的战略支点
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...
Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)
做RAG自己打算使用esmilvus自己开发一个,安装时好像网上没有比较新的安装方法,然后找了个旧的方法对应试试: 🚀 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana,适配中文搜索…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
