《汇编语言》- 读书笔记 - 第13章-int 指令

《汇编语言》- 读书笔记 - 第13章-int 指令

  • 13.1 int 指令
  • 13.2 编写供应用程序调用的中断例程
    • 中断例程:求一 word 型数据的平方
      • 主程序
      • 中断处理程序
      • 执行效果
    • 中断例程:将一个全是字母,以0结尾的字符串,转化为大写
      • 主程序
      • 中断处理程序
      • 执行效果
  • 13.3 对 int、iret 和栈的深入理解
      • 主程序
      • 中断处理程序
      • 分析
      • 执行效果
  • 检测点 13.1
  • 13.4 BIOS 和 DOS 所提供的中断例程
  • 13.5 BIOS 和 DOS 中断例程的安装过程
    • BIOS中断例程的安装:
    • DOS中断例程的安装:
  • 13.6 BIOS 中断例程应用
    • 功能 02H 设置光标位置
    • 功能 09H 在光标位置显示字符
  • 13.7 DOS 中断例程应用(INT 21H)
    • 功能 4CH:返回码方式的终止进程
    • 功能 09H:输出一个字符串到标准输出设备上
  • 实验 13 编写、应用中断例程
  • 参考资料

13.1 int 指令

int n 指令的功能是:引发 n 号中断过程,从而执行 n号中断处理程序
系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。
我们在编程的时候,可以用 int 指令调用这些子程序。
当然,也可以自己编写些中断处理程序供别人使用。
以后,我们可以将中断处理程序简称为中断例程

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

中断例程:求一 word 型数据的平方

问题一编写、安装中断 7ch 的中断例程。
功能求一 word 型数据的平方。
参数(ax)=要计算的数据。
返回dxax 中存放结果的高 16 位和低 16 位。
应用举例求 2*3456^2 = 16C8000h = 23,887,872

主程序

assume cs:code
code segmentstart:	mov ax,3456		; (ax)=3456int 7ch			; 调用中断 7ch 的中断例程,计算ax中的数据的平方; dx:ax 存放结果,将结果乘以2add ax,ax		; 先加低位adc dx,dx		; 再加高位(这里用了进位加法); 23887872mov ax,4c00hint 21h
code ends
end start

中断处理程序

assume cs:code
code segmentstart:	; ====================== 安装 ====================	; ------------------- 复制数据 -------------------mov ax,csmov ds,axmov si,offset sqr	;设置 ds:si 指向源地址mov ax,0mov es,axmov di,200h			;设置 es:di 指向目的地址mov cx,offset sqrend-offset sqr	;设置 cx为传输长度cld					;设置传输方向为正。movsb中si,di递增rep movsb			;重复复制数据次数由 cx 控制; ------------------- 复制数据 -------------------; ----------------- 设置中断向量 -----------------mov ax,0mov es,ax						; 段地址 0mov word ptr es:[7ch*4],200h	; 设置【中断处理程序】的:偏移地址mov word ptr es:[7ch*4+2],0		; 设置【中断处理程序】的:段地址; ----------------- 设置中断向量 -----------------; ====================== 安装 ====================	mov ax, 4c00H		; 退出int 21H; =======================================================	
; --------------------- 中断处理程序 --------------------
; ax 的平方
; -------------------------------------------------------
; 参数:ax			要计算的数据。
; 返回:dx、ax 		中存放结果的高 16 位和低 16 位。
; -------------------------------------------------------sqr:	mul ax			; ax * ax 结果 dx=16位,ax=16位iret 			; 返回原程序。 pop IP, pop CS, popfsqrend:	nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start
  • 安装功能跟之前都是一样的,只是改下值就行了。
  • 中断处理程序也很简单就是一个乘法就返回了。

执行效果

在这里插入图片描述

中断例程:将一个全是字母,以0结尾的字符串,转化为大写

问题二编写、安装中断 7ch 的中断例程。
功能将一个全是字母,以0结尾的字符串,转化为大写。
参数ds:si指向字符串的首地址。
应用举例data 段中的字符串转化为大写

主程序

assume cs:code
data segmentdb 'conversation',0
data endscode segmentstart:	mov ax,datamov ds,axmov si,0int 7ch		mov ax,4c00hint 21h
code ends
end start

中断处理程序

assume cs:code
code segmentstart:	; ====================== 安装 ====================	; ------------------- 复制数据 -------------------mov ax,csmov ds,axmov si,offset capital	;设置 ds:si 指向源地址mov ax,0mov es,axmov di,200h				;设置 es:di 指向目的地址mov cx,offset capitalend-offset capital	;设置 cx为传输长度cld					;设置传输方向为正。movsb中si,di递增rep movsb			;重复复制数据次数由 cx 控制; ---------------- 安装(复制数据) ----------------; ----------------- 设置中断向量 -----------------mov ax,0mov es,ax						; 段地址 0mov word ptr es:[7ch*4],200h	; 设置【中断处理程序】的:偏移地址mov word ptr es:[7ch*4+2],0		; 设置【中断处理程序】的:段地址; ----------------- 设置中断向量 -----------------; ====================== 安装 ====================mov ax, 4c00H		; 退出int 21H; =======================================================
; --------------------- 中断处理程序 --------------------
; 将一个全是字母,以0结尾的字符串,转化为大写。
; -------------------------------------------------------
; 参数:ds:si	指向字符串的首地址。
; -------------------------------------------------------capital:	push cx			; 备份寄存器push sichange:	mov cl,[si]		; 取字符mov ch,0		; 高位不参与计算,置 0 jcxz ok			; 如果取到 0 跳到 ok 循环结束and byte ptr [si],11011111b	; 否则:字符转大写inc si			; si++ 指向下一字符jmp short change; 跳到开头继续循环ok:	pop si			; 还原寄存器pop cxiret 			; 返回原程序。 pop IP, pop CS, popfcapitalend:	nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start

没什么新知识点,都是之前学过的:安装、遍历字符串、字符转大写。

执行效果

在这里插入图片描述

13.3 对 int、iret 和栈的深入理解

问题用 7ch 中断例程完成 loop 指令的功能 (模拟 loop s
参数bx 存 s 到 se 之间的位移
cx 循环次数
返回
应用举例在屏幕中间显示80个“!”

主程序

assume cs:code
code segmentstart:	mov ax,0b800hmov es,axmov di,160*12				; 从第16向第一个字符开始(正好一行80个字符)mov bx,offset s-offset se	; 参数:se到s的【位移】= -9mov cx,80					; 参数:循环80; ES: 当前偏移量 000Eh = 23 + (-9) = 14s:	mov byte ptr es:[di],'!'	; add di,2int 7ch						; 实现 loop s 效果se:	nop							; 当前偏移量 0017h = 23mov ax,4c00hint 21h
code ends
end start

在这里插入图片描述

  1. sse 共 9 个字节。把它存进 bx,传给中断处理程序,
    在中断处理程序中我们就是利用它来算出 s 偏移量,来实现循环的。
  2. 从上面的截图可以看出 mov byte ptr es:[di],'!' 这一句被反编译成了两句。
    2.1. 先是 ES: 看上去是设置默认数据段的意思 。
    2.2. 因为第二句中 MOV BYIE PIR [DI],21 中没有写段地址,只写了 [DI]

中断处理程序

assume cs:code
code segmentstart:	; ---------------- 安装(复制数据) ----------------mov ax,csmov ds,axmov si,offset lp		;设置 ds:si 指向源地址mov ax,0mov es,axmov di,200h				;设置 es:di 指向目的地址mov cx,offset lpend-offset lp	;设置 cx为传输长度cld					;设置传输方向为正。movsb中si,di递增rep movsb			;重复复制数据次数由 cx 控制; ---------------- 安装(复制数据) ----------------; ----------------- 设置中断向量 -----------------mov ax,0mov es,ax						; 段地址 0mov word ptr es:[7ch*4],200h	; 设置【中断处理程序】的:偏移地址mov word ptr es:[7ch*4+2],0		; 设置【中断处理程序】的:段地址; ----------------- 设置中断向量 -----------------mov ax, 4c00H		; 退出int 21H				; 触发33号中断; =======================================================
; --------------------- 中断处理程序 --------------------
; 模拟 loop s 效果
; -------------------------------------------------------
; 参数:bx		下一句指令到 s 之间的位移
; 参数:cx-1	循环次数
; -------------------------------------------------------lp:	push bp			; 备份寄存器mov bp,sp		; 取栈顶所指的内存位置dec cx			; 计数 cx = cx-1jcxz lpret		; cx 为 0 就跳出循环add [bp+2],bx	; 分析:1lpret:	pop bp			; 还原寄存器iret 			; 分析:2 【重点】lpend:	nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start

分析

  • 分析1. 上面我们从 sp 拿到了栈顶内存地址存到 bp
    这里我们就直接修改这段内存中的偏移量了。当前栈中:[bp, ip, cs, flags]
    注意:这时的 bp 是栈顶,跟栈中备份的那个bp值可不是同一个东西了
    所以修改时使用的是 [bp+2] 指向中断前备份的 IP
  • 分析2. iret 是用来返回原程序,继续执行的。它会从栈中恢复中断前保存的寄存器状态,还原了CS:IP 就能实现继续执行中断前的下一条指令了。
pop IP
pop CS
popf

这里是本节的重点了:欺骗善良无知的iret

  1. 在中断触发前,IP 指向了标号 se 处。(在主程序中我已经计算出了ses之间的偏移)
  2. 中断过程中,会备份当前寄存器:pushf, push cs, push ip
  3. 中断处理程序中:我们在 add [bp+2],bx ; 分析:1 这句修改了栈中备份的IP的值。
    所以iret恢复后其实指向了标号 s,这也就实现了跳回去重新执行的效果。

执行效果

在这里插入图片描述

检测点 13.1

《汇编语言》- 读书笔记 - 检测点 13.1

13.4 BIOS 和 DOS 所提供的中断例程

  1. BIOS(基本输入输出系统)存储在系统板ROM中,包含以下内容:
    • 硬件系统检测初始化程序
    • 外部中断内部中断的中断例程
    • 用于对硬件设备进行I/O操作的中断例程
    • 其他与硬件系统相关的中断例程
  2. DOS操作系统同样提供了中断例程,这些例程是操作系统程序员提供的编程接口
  3. BIOS和DOS提供的中断例程包括许多子程序,它们实现了常见的编程功能。
  4. 程序员可以通过int指令直接调用:BIOSDOS中断例程来完成特定任务。
  5. 硬件设备相关DOS中断例程通常会进一步调用BIOS的中断例程以执行底层硬件操作。

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

在8086架构的早期个人计算机系统中,BIOS和DOS中断例程的安装过程并非由用户程序直接执行安装,而是内置于系统的初始化过程中。以下是一个简化的概述:

BIOS中断例程的安装:

  1. 开机后,CPU 一加电,自动从FFFF:0000H地址处开始执行ROM中的代码(即BIOS)。
    (这个位置存放着一条跳转指令,它会跳转到ROM中的实际BIOS启动代码区域。)
  2. BIOS首先进行硬件自检(POST, Power-On Self-Test),检测和初始化硬件设备。
  3. BIOS建立中断向量表,将自身的中断处理程序入口地址填入到中断向量表对应的内存位置。
    (只需要有登记入口地址,因为中断处理程序本身已固化在BIOS的ROM中。)

DOS中断例程的安装:

  1. 硬件自检和初始化完成后,调用 int 19h 进行操作系统的引导。
    1.1. 在BIOSint 19h 中断做出响应时,它首先从硬盘的第一个扇区(即主引导记录MBR)读取512字节的数据到内存特定位置(如0x7C00)。
    1.2. MBR中的前446字节通常是机器码构成的操作系统引导程序(Boot Loader),该引导程序接着会被CPU执行。
    1.3. 引导程序的任务是找到并加载实际的操作系统,例如MS-DOS或更现代的操作系统的核心文件,并将控制权转交给操作系统。
  2. 当DOS启动时,它会接管控制权,并且根据需要重定向某些中断向量,以便调用自己的中断例程来处理特定的服务请求。
  3. DOS通常会保留一部分中断向量用于调用原始的BIOS服务,同时提供额外的中断服务例程以支持文件操作、磁盘读写等功能。

总之,在8086环境下,BIOS和DOS中断例程的安装是指在系统启动阶段由固件操作系统自动完成中断向量表的填充和设置,而不是程序员手动安装的过程。

《汇编语言》- 读书笔记 - 检测点 13.2.

13.6 BIOS 中断例程应用

功能 02H 设置光标位置

INT 10H显示服务 Video Service
功能02H设置光标位置
参数AH=调用 02H 号子程序
BH=显示页码
DH=行(Y坐标)
DL=列(X坐标)
返回
assume cs:code
code segmentstart:	mov ah,2	; 设置光标位置mov bh,0	; 显示页码,第0页mov dh,5	; dh 中放行号mov dl,12	; dl 中放列号int 10hok:	mov ax,4c00hint 21h
code ends
end start

在这里插入图片描述

功能 09H 在光标位置显示字符

INT 10H显示服务 Video Service
功能09H在当前光标处按指定属性显示字符
参数AH=功能号 09H
AL=字符内容
BH=显示页码
BL=颜色属性
CX=字符重复个数
返回
assume cs:code
code segmentstart:	mov ah,2			; 设置光标位置mov bh,0			; 显示页码,第0页mov dh,5			; dh 中放行号mov dl,12			; dl 中放列号int 10hmov ah,9			; 在光标位置显示字符mov al,'a'			; 字符内容mov bl,11001010b	; 颜色属性mov bh,0			; 显示页码mov cx,20			; 字符重复个数int 10hok:	mov ax,4c00hint 21h
code ends
end start

在这里插入图片描述

13.7 DOS 中断例程应用(INT 21H)

在8086架构下,int 21hDOS操作系统为应用程序提供的一种系统API
通过调用int 21h并设置不同的AH寄存器值,程序员可以请求执行多种操作,如:文件操作、设备I/O、内存管理等。
这些中断服务例程相当于DOS系统的函数库,使得应用程序能够与操作系统进行交互和访问底层资源。

功能 4CH:返回码方式的终止进程

INT 21HDOS 中断例程
功能 4CH终止程序的执行,并可返回一个代码
参数AH=功能号 4CH
AL=返回值
返回
mov ah,4ch		; 调用 4ch 号功能
mov al,00h		; 返回值
int 21h

功能 09H:输出一个字符串到标准输出设备上

INT 21HDOS 中断例程
功能09H输出一个字符串到标准输出设备上。待显示的字符串以$作为其结束标志
参数AH=功能号09H
DS:DX=待输出字符的地址
返回
assume cs:code
data segmentdb 'Welcome to masm','$'
data endscode segmentstart:	mov ah,2			; 设置光标位置mov bh,0			;0页显示mov dh,5			; dh 中放行号mov dl,12			; dl 中放列号int 10hmov ax,datamov ds,axmov dx,0			;ds:dx指向字符串的首地址 data:0mov ah,9int 21hok:	mov ax,4c00hint 21h
code ends
end start

在这里插入图片描述

实验 13 编写、应用中断例程

《汇编语言》- 读书笔记 - 第13章-实验13编写、应用中断例程

参考资料

DOS 中断参考手册

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

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

相关文章

IDEA利用鼠标调整字体大小

就可以按住ctrl和鼠标调节代码字体的大小啦! 如果有用,记得给我来个赞~ 谢啦!

【性能测试】loadrunner12.55--知识准备

1.0. 前言 ​ 在性能测试中,牵扯到了许多比较杂的知识点,这里将给大家说一下,loadrunner性能测试前需要做的一些准备,本节中我们将先从性能测试的一些术语入手,再到HTTP的一些知识,最后导我们loadrunner12…

应用多元统计分析--多元数据的直观表示(R语言)

例1.2 为了研究全国31个省、市、自治区2018年城镇居民生活消费的分布规律,根据调查资料做区域消费类型划分。 指标: 食品x1:人均食品支出(元/人) 衣着x2:人均衣着商品支出(元/人) 居住x3:人均居住支出(元/人) 生活x4…

RabbitMQ实战学习

RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…

Java配置49-nginx 反向代理 sftp 服务器

1. 背景 后端服务需要通过部署在跳板机上的 nginx 访问一个外网的 SFTP 服务器。 2. 方法 nginx从 1.9.0 开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。 首先检查 nginx 版本信息及是否安装了 stream 模块。 进入 ngi…

React入门之React_使用es5和es6语法渲染和添加class

React入门 //react的核心库 <script src"https://cdn.jsdelivr.net/npm/react17/umd/react.development.js"></script> //react操作dom的核心库&#xff0c;类似于jquery <script src"https://cdn.jsdelivr.net/npm/react-dom17/umd/react-dom.…

USB-C接口:办公新宠,一线连接笔记本与显示器

USB-C接口如今已成为笔记本与显示器连接的优选方案。无需担心正反插错&#xff0c;支持雷电4和DP视频信号输出&#xff0c;高速数据传输&#xff0c;还有最高100W的快充功能&#xff0c;真是方便又实用&#xff01; 一线连接&#xff0c;多功能融合 通过这个接口&#xff0c;你…

Unity 游戏设计模式:工厂模式

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 工厂模式是一种创建型设计模式&#xff0c;它提供了一种封装对象实例化过程的方式&#xff0c;使得客户端代码与具体类的实现解耦。 在 C# 的游戏设计中&#xff0c;模式有以下作用&#xff1a; 对象的创建…

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived&#xff08;高可用性服务&#xff09;1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

mongo之常用数据库操作

目录 一、准备环境 二、日常记录及执行示范 连接数据库查询版本查询表总数模糊查询(使用正则)查询文档中数据条数排序大于等于查询有哪些库时间查询不在条件内的查询复制数据更新字段名称删除数据库 四、高阶查询 五、备份迁移数据库 总结 一、准备环境 借鉴&#xff1a;…

模型选择与评估

&#x1f6a9; 机器学习的一般流程包括&#xff1a;数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中&#xff0c;我们往往有多种学习算法可供选择&#xff0c;甚至对同一个学习算法&#xff0c;当使用不同的参数配置时&#xff0c;也会产生不同的模型…

模块整理!YOLOv9中的“Silence”、“RepNCSPELAN4”、“ADown”、“CBLinear”创新模块汇总!

代码链接&#xff1a;https://github.com/WongKinYiu/yolov9/tree/main 论文链接&#xff1a;YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 大量文字及图片来袭&#xff01; 本文整理了YOLOv9中的创新模块&#xff0c;附代码和结构图&a…

【Java程序设计】【C00323】基于Springboot的高校科研信息管理系统(有论文)

基于Springboot的高校科研信息管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校科研信息管理系统&#xff0c;本系统有管理员、学校管理员、科研人员三种角色&#xff1b; 管理员&#xff1a;首页、个…

JavaWeb之 创建 Web项目,使用Tomcat 部署项目,使用 Maven 构建Web项目(一万八千字详解)

目录 前言3.1 Tomcat 简介3.1.1 什么是 Web服务器3.1.2 Tomcat 是什么3.1.3 小结 3.2 Tomcat 的基本使用3.2.1 下载 Tomcat3.2.2 安装 Tomcat3.2.3 卸载 Tomcat3.2.4 启动 Tomcat3.2.5 关闭 Tomcat3.2.6 配置 Tomcat3.2.7 在 Tomcat 中部署 Web项目 3.3 在 IDEA 中创建 Web 项目…

(C语言)二分查找

在⼀个升序的数组中查找指定的数字n&#xff0c;很容易想到的⽅法就是遍历数组&#xff0c;但是这种⽅法效率⽐较低。⽐如我买了⼀双鞋&#xff0c;你好奇问我多少钱&#xff0c;我说不超过300元。你还是好奇&#xff0c;你想知道到底多少&#xff0c;我就让你猜&#xff0c;你…

【电路笔记】-RC网络-RC积分器

RC积分器 文章目录 RC积分器1、概述2、RC积分器3、电容电压4、单脉冲 RC 积分器5、RC积分器示例6、RC 积分器作为正弦波发生器7、总结RC 积分器是一个串联的 RC 网络,可产生与积分的数学过程相对应的输出信号。 1、概述 对于无源 RC 积分器电路,输入连接到电阻,而输出电压取…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

【生态适配】亚信安慧AntDB数据库与FT-2000+/64处理器完成兼容互认

日前&#xff0c;亚信安慧AntDB数据库完成了与FT-2000/64处理器的兼容互认。经湖南亚信安慧科技有限公司&#xff08;简称“亚信安慧”&#xff09;与飞腾信息技术有限公司&#xff08;简称“飞腾公司”&#xff09;的严格测试&#xff0c;亚信安慧AntDB数据库V6.2在FT-2000/64…

【前端素材】推荐优质在线家具电商网页Hurst平台模板(附源码)

一、需求分析 1、系统定义 家具电商平台是指专门销售家具产品的在线电子商务平台。这些平台专注于家具类商品的销售和服务&#xff0c;为消费者提供方便快捷的购买体验。 2、功能需求 在线家具商城平台是指通过互联网提供家具购买服务的电子商务平台。这类平台为消费者和家…

基于ESP32的MicroPython项目量产烧写指南

背景 前段时间用MicroPython开发了一个项目&#xff0c;硬件是ESP32-C3&#xff0c;目前准备量产&#xff0c;我需要提供固件以供加工厂批量烧录&#xff0c;需要把我有程序的板子里的程序读出来&#xff0c;然后下到别的板子上&#xff0c;以下做这件事情的过程记录。 1.固件…