8086汇编 实验13编写、应用中断程序

实验1

(1)编写并安装int 7ch中断例程,功能为显示一个用О结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si 指向字符串首地址。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret 指令执行前后CS、IP和栈中的状态。

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中断例程, 功能为显示
;一个用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
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset show_strend-offset show_str
		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:
		mov bl,cl		;颜色属性
		mov bh,0		;0页

	s:	mov ah,2		;置光标
		;dh行号, dl列号
		int 10h

		mov ch,0
		mov cl,ds:[si]
		jcxz ok
		mov ah,9		;在光标位置显示字符
		mov al,cl		;字符
		; mov bh,0		;0页
		mov cx,1		;字符重复个数
		inc si
		inc dl
		int 10h
		jmp short s
	ok:	iret
show_strend:nop

code ends
end start

运行结果:
在这里插入图片描述

方法二修改显存数据

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

code segment

start:	mov ax,cs
		mov ds,ax
		mov si,offset show_str
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset show_strend-offset show_str
		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

;参数: (dh)=行号, (dl)=列号, (cl)=颜色, ds:si指向字符串首地址
show_str:
		mov ax,0b800h
		mov es,ax
		mov al,160
		mul dh
		mov dh,0
		add dx,dx
		add ax,dx
		mov di,ax			;显示位置es:bx
		mov dl,cl			;dl显示颜色属性

	s:	mov ch,0
		mov cl,ds:[si]
		jcxz ok
		mov es:[di],cl
		mov es:[di+1],dl
		inc si
		add di,2
		jmp short s
	ok:	iret

show_strend:nop

code ends
end start

运行结果:
在这里插入图片描述

实验2

(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能
参数:(cx)=循环次数,(bx)=位移
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后CS、IP和栈中的状态。
在屏幕中间显示80个“!”。

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

安装例程:

;编写并安装int 7ch中断例程, 功能为完成loop指令的功能
assume cs:code

code segment
start:	mov ax,cs
		mov ds,ax
		mov si,offset lp

		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset lpend-offset lp
		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

;参数: (cx)=循环次数, (bx)=位移
lp:		push bp
		mov bp,sp
		dec cx
		jcxz ok
		add ss:[bp+2],bx
	ok: pop bp
		iret
lpend:	nop

code ends
end start

运行结果:
在这里插入图片描述

实验3

(3)下面的程序,分别在第2/24/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,____			;设置行
		mov dl,0			;设置列
		mov ah,2			;置光标
		int 10h

		mov dx,____
		mov ah,9			;在光标位置显示字符
		int 21h
		____________
		____________
		loop ok

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

补全后程序:

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]		;设置行
		mov dl,0			;设置列
		mov ah,2			;置光标
		int 10h

		mov dx,ds:[bx]		;显示英文诗句
		mov ah,9			;在光标位置显示字符
		int 21h				;调用后可以显示ds:dx, 直到$截止

		add bx,2
		inc si
		loop ok

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

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值