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

本文详细描述了如何在汇编语言中编写并安装中断例程,如int7ch,以实现特定功能,如显示字符串和模拟loop指令。作者还提供了主程序示例和如何使用中断指令配合BIOS和DOS中断来控制屏幕输出。
摘要由CSDN通过智能技术生成

1. 编写并安装中断例程

需求编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在 0:200 处。
参数(dh)=行号
(dl)=列号
(cl)=颜色
ds:si指向字符串首地址。
assume cs:code
code segment
 start:	; ---------------- 安装(复制数据) ----------------
		mov ax,cs
		mov ds,ax
		mov si,offset i7ch		;设置 ds:si 指向源地址
		
		mov ax,0
		mov es,ax
		mov di,200h				;设置 es:di 指向目的地址

		mov cx,offset i7chend -offset i7ch	;设置 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号中断
		
; =======================================================
; --------------------- 中断处理程序 --------------------
; 在指定位置,打印字符串。以 0 结束
; -------------------------------------------------------
; 参数:(dh)=行号
; 参数:(dl)=列号
; 参数:(cl)=颜色
; 参数:ds:si 指向字符串首地址。
; -------------------------------------------------------
	  i7ch:	push es			; 备份寄存器
			push di
			push dx
			push cx
			
			mov ax,0b800h	; 设置显存
			mov es,ax
			mov al,160		; 先算行偏移
			dec dh				; 行号从 0 开始,所以这里要先减1
			mul dh				; 行数 x 160算出行偏移
			mov di,ax			; 行偏移先存到 di
			mov al,2		; 再算列偏移
			dec dl				; 列号从 0 开始,所以这里要先减1
			mul dl				; 每列2* 列号
			add di,ax		;+= 算出目标字符串(显存)的开始位置
			mov ch,cl		; 文字属性放到 ch 去
			
	 sloop:	mov cl,[si]			; 取字符
	 		cmp cl,0			; 判断如果取到的是 0
			je ok				; 就跳出循环结束,否则继续
			mov es:[di],cx	; 字符写入显存
			inc si				; si 递增,源字符串指向下一字符
			add di,2			; di += 2,目标字符串指向下一字符
			jmp short sloop
			
		ok:	pop cx			; 还原寄存器
			pop dx
			pop di
			pop es
			iret 			; 返回原程序
   i7chend:	nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start

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

主程序

assume cs:code
data segment
	db 'Welcome to masm',0
data ends

code segment
 start:	mov dh,10			; dh 中放行号
		mov dl,10			; dl 中放列号
		mov cl,2			; 文字颜色属性
		mov ax,data 		; 设置数据段
		mOv ds,ax
		mov si,0			; 指向data开头字符
		int 7h
		
	ok:	mov ax,4c00h
		int 21h
code ends
end start

运行效果

在这里插入图片描述

int 前后iret 前后
在这里插入图片描述在这里插入图片描述

2. 编写并安装 int 7ch 中断例程,功能为完成 loop 指令的功能。

第13章-int 指令 - 13.3 已实现此功能。

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		; 取诗句偏移量,dw 类型每个元素2字节
		mov si,offset row	; 取行数偏移量,db 类型每个元素1字节
		mov cx,4
	ok:	mov bh,0			; 第几页显示
		mov dh,[si]			;(Y坐标)___________
		mov dl,0			;(X坐标)
		mov ah,2			; 10h中断2号子程序:设置光标位置
		int 10h				; BIOS中断:显示服务
		
		mov dx,[bx] 		; DS:DX 待输出字符的地址___________
		mov ah,9			; 21h中断9号子程序:显示字符串
		int 21h				; DOS中断
		inc si				; 下一个行数___________
		add bx,2			; 下一条诗句___________
		loop ok

		mov ax,4c00h
		int 21h
code ends
end start

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值