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

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

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

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

;sy13_1.asm

assume cs:code 
data segment 
	db "welcome to masm! ",0
data ends

code segment 
start:	mov dh,10
		mov dl,10
		mov cl,2 
		mov ax,data 
		mov ds,ax 
		mov si,0
		int 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,0
				mov es,ax 
				mov di,200h 								;设置es:di指向目标地址
				mov cx,offset show_strend - offset show_str;设置cx为传输长度 
				cld											;设置传输方向为正
				rep movsb 
				;设置中断向量表 
				mov ax,0
				mov es,ax 
				mov word ptr es:[7ch*4],200h 
				mov word ptr es:[7ch*4+2],0
					
				mov ax,4c00h
				int 21h 
;名称:show_str 
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。 
;参数:(dh)=行号(取值范围0~24); 
;      (dl)=列号(取值范围0~79); 
;      (cl)=颜色; 
;      ds:si指向字符串的首地址。 
;返回:无。
show_str:		push ax 
				push bx
				push es 
				push si 
				mov ax,0b800h 
				mov es,ax 
				mov ax,160
				mul dh 
				mov bx,ax 					;bx=160*dh 
				mov ax,2
				mul 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,4c00h
				int 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,0b800h
		mov es,ax 
		mov di,160*12
		mov bx,offset s - offset se 		;设置从标号 se到标号 s的转移位移
		mov cx,80
	s:	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,0
		mov es,ax 
		mov di,200h 							;设置es:di指向目标地址
		mov cx,offset lpend - offset lp 		;设置cx为传输长度
		cld										;设置传输方向为正
		rep movsb 
		;设置中断向量表
		mov ax,0
		mov es,ax 
		mov word ptr es:[7ch*4],200h 
		mov word ptr es:[7ch*4+2],0
				
		mov ax,4c00h 
		int 21h 
	lp:	push bp 
		mov bp,sp 
		dec cx
		jcxz lpret
		add 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,4c00h
		int 21h 
code ends
end start 

运行结果:

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值