当前位置: 首页 > news >正文

《汇编语言》第13章 int指令——实验13 编写、应用中断例程

(1)编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。

参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。

以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret指令执行前后CS、IP和栈中的状态。

;sy13_1.asmassume cs:code 
data segment db "welcome to masm! ",0
data endscode segment 
start:	mov dh,10mov dl,10mov cl,2 mov ax,data mov ds,ax mov si,0int 7ch mov ax,4c00h int 21h 
code ends
end start

int 7ch 中断程序

;sy13_1i.asm 实验13(1)的 int 7c中断例程
;功能:显示一个0结束的字符串,中断例程安装在0:200处
;参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址assume cs:code 
code segment 
start:			mov ax,cs mov ds,ax mov si,offset show_str 						;设置ds:si指向源地址mov ax,0mov es,ax mov di,200h 								;设置es:di指向目标地址mov cx,offset show_strend - offset show_str;设置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,4c00hint 21h 
;名称:show_str 
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。 
;参数:(dh)=行号(取值范围0~24); 
;      (dl)=列号(取值范围0~79); 
;      (cl)=颜色; 
;      ds:si指向字符串的首地址。 
;返回:无。
show_str:		push ax push bxpush es push si mov ax,0b800h mov es,ax mov ax,160mul dh mov bx,ax 					;bx=160*dh mov ax,2mul dl 						;ax=dl*2 add bx,ax 					;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址mov al,cl 					;把颜色cl赋值al mov cl,0
show0:			mov ch,ds:[si] jcxz show1 					;(ds:si)=0时,转到show1执行  mov es:[bx],ch mov es:[bx+1],al inc si 						;ds:si指向下一个字符地址add bx,2 					;es:bx指向下一个显存地址jmp show0 
show1:			pop si pop es pop bx pop ax iret mov ax,4c00hint 21h show_strend: nop 
code ends
end start

运行结果:

 

(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。参数:(cx)=循环次数,(bx)=位移。

以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret指令执行前后CS、IP和栈中的状态。

在屏幕中间显示80个“!”。

;sy13_2.asm  assume cs:code 
code segment 
start:	mov ax,0b800hmov es,ax mov di,160*12mov bx,offset s - offset se 		;设置从标号 se到标号 s的转移位移mov cx,80s:	mov byte ptr es:[di],'!'add di,2 int 7ch 										;如果(cx)≠0,转移到标号s处se:	nop mov ax,4c00h int 21h 
code ends 
end start 

中断程序源码

;sy13_2.asm   实现13(2)的int 7ch中断程序assume cs:code 
code segment ;安装中断程序
start:	mov ax,cs mov ds,ax mov si,offset lp						;设置ds:si指向源地址mov ax,0mov es,ax mov di,200h 							;设置es:di指向目标地址mov cx,offset lpend - offset lp 		;设置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 21h lp:	push bp mov bp,sp dec cxjcxz lpretadd ss:[bp+2],bx 	;功能实质是IP = offset se + (offset s - offset se) = offset s lpret:	pop bp iret 								;跳转到s标号处理mov ax,4c00h int 21h 
lpend:	nop code ends 
end start 

运行调试

进入7ch中断程序代码

执行中断代码,psw,cs,ip,bp相继入栈

iret指令执行完成后回到主程序

g 0018指令结束程序

 

(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。

;sy13_3.asm    (3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。assume cs:code 
code segment s1: db 'Good,better,best,,','$'s2: db 'Never let it rest','$'s3: db 'Till good is better,','$'s4: db 'And better,best.,','$'s:	dw offset s1, offset s2, offset s3,offset s4 
row:	db 2,4,6,8
start:  mov ax,cs mov ds,ax mov bx,offset s mov si,offset row mov cx,4 
ok:	    mov bh,0					;第0页mov dh,ds:[si]				;dh中放行号mov dl,0					;dl中放列号mov ah,2 					;置光标int 10h mov dx,ds:[bx]				;ds:dx指向字符串首地址mov ah,9					;在光标位置显示字符int 21h inc si 						;行号递增add bx,2					;指向下一字符串loop ok mov ax,4c00hint 21h 
code ends
end start 

运行结果:

 

完成后编译运行,体会其中的编程思想。

http://www.lqws.cn/news/76753.html

相关文章:

  • leetcode93.复原IP地址:回溯算法中段控制与前导零处理的深度解析
  • Spring Boot 3.X 下Redis缓存的尝试(一):初步尝试
  • Oracle授权操作
  • Mysql备份
  • 【MySQL】视图与用户管理
  • isp中的 ISO代表什么意思
  • Android Studio 配置之gitignore
  • 平滑技术(数据处理,持续更新...)
  • JAVA学习-练习试用Java实现“PCA(主成分分析) :用于降维和数据可视化”
  • DeepSeek模型安全部署与对抗防御全攻略
  • DAY43打卡
  • 力扣LeetBook数组和字符串--数组简介
  • 力扣HOT100之动态规划:32. 最长有效括号
  • 20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s
  • 代码随想录算法训练营第四天| 242.有效的字母异位词 、 349. 两个数组的交集 、 202. 快乐数 、1. 两数之和
  • 5.RV1126-OPENCV 图形计算面积
  • Android基于LiquidFun引擎实现软体碰撞效果
  • android binder(二)应用层编程实例
  • 循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例
  • 基于 Android 和 JBox2D 的简单小游戏
  • 实验一:PyTorch基本操作实验
  • 力扣热题100之对称二叉树
  • LeetCode 热题 100 394. 字符串解码
  • C#项目07-二维数组的随机创建
  • CppCon 2014 学习:Exception-Safe Coding
  • Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)
  • Python----目标检测(训练YOLOV8网络)
  • FreeBSD 14.3 候选版本附带 Docker 镜像和关键修复
  • 嵌入式鸿蒙开发环境搭建操作方法与实现
  • web架构3------(nginx的return跳转,gzip压缩,目录浏览,访问控制和location符号优先级)