汇编语言实验13详细解析

汇编语言实验13详细解析

建议先自己思考问题的答案,不懂则返回看书

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

安装程序:DE13_1an.asm

assume cs:code
code segment
start:
	;安装
	mov ax,cs
	mov ds,ax
	mov si,offset display
	mov ax,0
	mov es,ax
	mov di,200h

	mov cx,offset displayend - offset display
	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
	
display:
	mov ax,0b800h
	mov es,ax
	
	mov al,dh
	dec al
	mov ah,160
	mul ah			;得到行偏移,ax中存放
	mov dh,0
	dec dl
	add dl,dl		;得到列偏移,dx中存放
	add ax,dx
	mov di,ax
	
	mov ah,00010100b
s:
	cmp byte ptr ds:[si],0
	je over

	mov al,ds:[si]
	mov es:[di],ax
	inc si
	inc di
	inc di
	jmp short s
     over:	
	iret
displayend:
	nop

code ends
end start

测试程序:DE13_17c.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,0h
	int 7ch

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

先执行安装程序,再执行测试程序,安装程序运行完毕后,重写的int 7ch中断例程已代替原有的中断例程,只要不重启DOSBox就一直保存着新的int 7ch 中断例程,就可以继续执行测试程序了。
此代码在DOSBox下的运行结果截图:
在这里插入图片描述

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

安装程序:DE13_2an.asm

assume cs:code
code segment
start:
	;安装
	mov ax,cs
	mov ds,ax
	mov si,offset display
	mov ax,0
	mov es,ax
	mov di,200h

	mov cx,offset displayend - offset display
	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

display:
	dec cx
	jcxz displayover
	push bp
	mov bp,sp
	add ss:[bp+2],bx
	pop bp
      displayover:	
	iret
displayend:
	nop
code ends
end start

测试程序:DE13_27c.asm

assume cs:code
code segment
start:
	;调用显示
	mov ax,0b800h
	mov es,ax
	mov di,160*12
	mov bx,offset s - offset se
	mov cx,80
s:
	mov byte ptr es:[di],'!'
	add di,2
	int 7ch
se:	nop

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

此代码在DOSBox下的运行结果截图:
在这里插入图片描述
(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 beter,','$'
  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
	mov dh,ds:[si]
	mov dl,0
	mov ah,2
	int 10h			;置光标
	
	mov dx,ds:[bx]
	mov ah,9
	int 21h
	inc si
	add bx,2

	loop ok

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

此代码在DOSBox下的运行结果截图:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值