《汇编语言》- 读书笔记 - 第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 segment
 start:	mov ax,3456		; (ax)=3456
		int 7ch			; 调用中断 7ch 的中断例程,计算ax中的数据的平方
		; dx:ax 存放结果,将结果乘以2
		add ax,ax		; 先加低位
		adc dx,dx		; 再加高位(这里用了进位加法)
						; 23887872
		mov ax,4c00h
		int 21h
code ends
end start

中断处理程序

assume cs:code
code segment
 start:	; ====================== 安装 ====================	
 		; ------------------- 复制数据 -------------------
		mov ax,cs
		mov ds,ax
		mov si,offset sqr	;设置 ds:si 指向源地址
		
		mov ax,0
		mov es,ax
		mov di,200h			;设置 es:di 指向目的地址

		mov cx,offset sqrend-offset sqr	;设置 cx为传输长度
		cld					;设置传输方向为正。movsb中si,di递增
		rep movsb			;重复复制数据次数由 cx 控制
		; ------------------- 复制数据 -------------------
		
		; ----------------- 设置中断向量 -----------------
		mov ax,0
		mov es,ax						; 段地址 0
		mov 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, popf
		
sqrend:	nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start
  • 安装功能跟之前都是一样的,只是改下值就行了。
  • 中断处理程序也很简单就是一个乘法就返回了。

执行效果

在这里插入图片描述

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

问题二编写、安装中断 7ch 的中断例程。
功能将一个全是字母,以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

中断处理程序

assume cs:code
code segment
 start:	; ====================== 安装 ====================	
 		; ------------------- 复制数据 -------------------
		mov ax,cs
		mov ds,ax
		mov si,offset capital	;设置 ds:si 指向源地址
		
		mov ax,0
		mov es,ax
		mov di,200h				;设置 es:di 指向目的地址

		mov cx,offset capitalend-offset capital	;设置 cx为传输长度
		cld					;设置传输方向为正。movsb中si,di递增
		rep movsb			;重复复制数据次数由 cx 控制
		; ---------------- 安装(复制数据) ----------------
		
		; ----------------- 设置中断向量 -----------------
		mov ax,0
		mov es,ax						; 段地址 0
		mov 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 si
	change:	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 cx
			iret 			; 返回原程序。 pop IP, pop CS, popf
		
capitalend:	nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start

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

执行效果

在这里插入图片描述

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

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

主程序

assume cs:code
code segment
 start:	mov ax,0b800h
		mov es,ax
		mov di,160*12				; 从第16向第一个字符开始(正好一行80个字符)
		
		mov bx,offset s-offset se	; 参数:se到s的【位移】= -9
		mov cx,80					; 参数:循环80; ES: 当前偏移量 000Eh = 23 + (-9) = 14
	s:	mov byte ptr es:[di],'!'	; 
		add di,2
		int 7ch						; 实现 loop s 效果
   se:	nop							; 当前偏移量 0017h = 23
   
		mov ax,4c00h
		int 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 segment
 start:	; ---------------- 安装(复制数据) ----------------
		mov ax,cs
		mov ds,ax
		mov si,offset lp		;设置 ds:si 指向源地址
		
		mov ax,0
		mov es,ax
		mov di,200h				;设置 es:di 指向目的地址

		mov cx,offset lpend-offset lp	;设置 cx为传输长度
		cld					;设置传输方向为正。movsb中si,di递增
		rep movsb			;重复复制数据次数由 cx 控制
		; ---------------- 安装(复制数据) ----------------
		
		; ----------------- 设置中断向量 -----------------
		mov ax,0
		mov es,ax						; 段地址 0
		mov 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-1
		jcxz lpret		; cx 为 0 就跳出循环
		add [bp+2],bx	; 分析:1
		
 lpret:	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 segment
 start:	mov ah,2	; 设置光标位置
		mov bh,0	; 显示页码,第0页
		mov dh,5	; dh 中放行号
		mov dl,12	; dl 中放列号
		int 10h
	ok:	mov ax,4c00h
		int 21h
code ends
end start

在这里插入图片描述

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

INT 10H显示服务 Video Service
功能09H在当前光标处按指定属性显示字符
参数AH=功能号 09H
AL=字符内容
BH=显示页码
BL=颜色属性
CX=字符重复个数
返回
assume cs:code
code segment
 start:	mov ah,2			; 设置光标位置
		mov bh,0			; 显示页码,第0页
		mov dh,5			; dh 中放行号
		mov dl,12			; dl 中放列号
		int 10h
		
		mov ah,9			; 在光标位置显示字符
		mov al,'a'			; 字符内容
		mov bl,11001010b	; 颜色属性
		mov bh,0			; 显示页码
		mov cx,20			; 字符重复个数
		int 10h
		
	ok:	mov ax,4c00h
		int 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 segment
	db 'Welcome to masm','$'
data ends

code segment
 start:	mov ah,2			; 设置光标位置
		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
		int 21h
		
	ok:	mov ax,4c00h
		int 21h
code ends
end start

在这里插入图片描述

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

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

参考资料

DOS 中断参考手册

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

作业1-224——P1927 防护伞

思路 遍历一下找到两点间的最远距离&#xff0c;直接公式算结果&#xff0c;控制输出位数 参考代码 #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main() { int n; cin>>n; int x[n],y[n]; do…

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…

5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N&#xff0c;接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成本各不相同&#xff0c;且有些节点之间已经存在光纤相…

WIN10 无密码自动登录

1、家里重装了一下WIN10系统&#xff0c;第一次登陆居然用了微软网站账号&#xff0c;结果密码忘记了&#xff0c;后面只能用PIN码登陆系统。 2、需要登录微软的网站修改密码&#xff1a; Microsoft account | Sign In or Create Your Account Today – Microsoft 3、在运行…

赵本山与高秀敏夫妇本想找范伟要那1200元电视机垫款,却不好意思向范伟开口--小品《面子》(中1)的台词

赵本山与高秀敏夫妇本想找范伟要那1200元电视机垫款&#xff0c;却不好意思向范伟开口 --小品《面子》&#xff08;中1&#xff09;的台词 表演者&#xff1a;赵本山 高秀敏 范伟 &#xff08;接上&#xff09; 高秀敏&#xff1a;咱俩抓紧提事啊 赵本山&#xff1a;不着急…

div在vue的组件之中如何设置这个字体的颜色和样式大小

在Vue组件中设置<div>的字体颜色和样式大小可以通过两种主要方式实现&#xff1a;通过内联样式&#xff08;inline styles&#xff09;或者通过CSS类&#xff08;CSS classes&#xff09;。 使用内联样式 在Vue模板中直接在元素上使用style属性来设置样式。这种方法适用…

上云还是下云,最大挑战是什么?| 对话章文嵩、毕玄、王小瑞

近半年来&#xff0c;公有云领域频频发生阿里云、滴滴等平台崩溃事件&#xff0c;与此同时&#xff0c;马斯克的“X 下云省钱”言论引起了广泛关注&#xff0c;一时间&#xff0c;“上云”和“下云”成为热议话题。在最近举办的 AutoMQ 云原生创新论坛上&#xff0c;AutoMQ 联合…

【GPU驱动开发】- AST简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; AST&#xff0c;抽象语法树&#xff0c;是一种包含丰富语义信息的格式&#xff0c;其中包括类型、表达式树和符号等。 TranslationUnitDecl&#xff1a;该类表示一个输入源文件 ASTContext&…

通辽文化瑰宝沈阳展,文物预防性保护成亮点

灿烂的历史瑰宝&#xff0c;从通辽草原远道而来&#xff0c;于沈阳博物馆内熠熠生辉。展览汇聚了非常多的历史文物&#xff0c;每一件都承载着深厚的文化底蕴和民族记忆。但是&#xff0c;文物的易损性变成一个大问题。为了确保这些历史财产可以在最佳状态下向群众展现&#xf…

如何在腾讯云上快速部署幻兽帕鲁/Palworld服务器?

如何在腾讯云上快速部署幻兽帕鲁/Palworld服务器&#xff1f; 准备工作&#xff1a;首先需要准备腾讯云账号和Steam账号。腾讯云账号适用于新老用户&#xff0c;而Steam账号则是因为幻兽帕鲁是一款Steam平台的游戏。此外&#xff0c;还需要购买一台腾讯云服务器&#xff0c;推荐…

一线互联网架构师筑基必备技能之Android篇,快速从入门到精通

真正最能锻炼能力的便是直接去阅读源码&#xff0c;不仅限于阅读Android系统源码&#xff0c;还包括各种优秀的开源库。 由于整个文档比较全面&#xff0c;内容比较多&#xff0c;篇幅不允许&#xff0c;下面以截图方式展示 。 深入解析微信 MMKV 源码 初始化获取修改删除读取…

Java-常用集合

Jva常用集合 一、Java 集合框架体系二、Collection接口和方法1. List接口List 接口主要实现类&#xff1a;ArrayListList 的实现类之二&#xff1a;LinkedListList 的实现类之三&#xff1a;Vector 2. Set接口Set 主要实现类&#xff1a;HashSetSet 实现类之二&#xff1a;Link…

在UniApp中引入大于40kb字体包的记录

因为项目UI需要特殊字体&#xff0c;所以给了一个80kb字体包&#xff0c;但是在正常的使用导入时候发现不生效 这是我的导入过程 1.把下载好的文件放入static/font目录中 2.在app.vue中引用 font-face { font-family: zitiming; src: url(/static/font/YouSheBiaoTiHei-2.t…

【打工日常】使用docker部署在线PDF工具

一、Stirling-PDF介绍 Stirling-PDF是一款功能强大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker部署。该自托管 Web 应用程序最初是由ChatGPT全权制作的&#xff0c;现已发展到包含广泛的功能来处理您的所有 PDF 需求。允许对 PDF 文件执行各种操作&#xff0…

Flutter中的三棵树

Widget Tree&#xff1a; 页面配置信息。 Element Tree&#xff1a; Widget tree的实例化对象&#xff0c;创建出renderObject&#xff0c;并关联到element.renderobject属性上&#xff0c;最后完成RenderObject Tree的创建。 RenderObject Tree&#xff1a;完成布局和图层绘制…

HTML---表单验证

文章目录 目录 本章目标 一.表单验证概述 二.表单选择器 属性过滤选择器 三.表单验证 表单验证的方法 总结 本章目标 掌握String对象的用法会使用表单选择器的选择页面元素会使用JQuery事件进行表单验证Ajax的概念和作用 一.表单验证概述 前端中的表单验证是在用户提交表…

【多线程】常见锁策略详解(面试常考题型)

目录 &#x1f334; 乐观锁 vs 悲观锁&#x1f38d;重量级锁 vs 轻量级锁&#x1f340;自旋锁&#xff08;Spin Lock&#xff09;&#x1f38b;公平锁 vs ⾮公平锁&#x1f333;可重⼊锁 vs 不可重⼊锁&#x1f384;读写锁⭕相关面试题 常⻅的锁策略 注意: 接下来讲解的锁策略不…

【办公类-25-01】20240304 UIBOT上传 ”班级主页-信息窗“

一、背景需求&#xff1a; 本学期制作了 “信息窗主题说明”合并A4内容 【办公类-22-07】周计划系列&#xff08;3-1&#xff09;“信息窗主题知识&#xff08;提取&#xff09;” &#xff08;2024年调整版本&#xff09;-CSDN博客文章浏览阅读797次&#xff0c;点赞7次&…

Nuclei SDK启动流程分析

欢迎关注“安全有理”微信公众号。 概述 以nuclei-sdk-0.5.0版本进行说明&#xff0c;编译SoC和开发板分别选择默认的evalsoc和nuclei_fpga_eval&#xff0c;启动的汇编代码参见startup_evalsoc.S。 复位 /* If BOOT_HARTID is not defined, default value is 0 */ #ifndef …

Linux系统加固:限制用户对资源的使用禁止IP源路由更改主机解析地址的顺序设置umask值

Linux系统加固&#xff1a;限制用户对资源的使用&禁止IP源路由&更改主机解析地址的顺序&设置umask值 1.1 限制用户对资源的使用1.2 禁止IP源路由1.3 更改主机解析地址的顺序1.4 禁止ip路由转发1.5 设置umask值 &#x1f496;The Begin&#x1f496;点点关注&#x…
最新文章