实验13 编写、应用中断例程(续)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhaixh_89/article/details/101673264

(1)编写并安装int 7ch中断例程,功能为显示一个用0结尾的字符串,中断例程安装在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      ;所在行数:11行

        mov dl, 10      ;所在列数:11列

        mov cl, 2       ;字符属性

        mov ax, data

        mov ds, ax

        mov si, 0           ;入口参数ds:si指向字符串data

        int 7ch             ;调用9号子程序,显示字符串

       

        mov ax, 4c00H

        int 21H

code ends

end start  

根据题目要求,在学习本章内容之前,如第十章中实验做法一样,我们可以使用B8000H~BFFFFH这段空间来放置需要显示的字符串,除此之外,也可以使用本章的中断处理程序:21H号中断的9号子程序来显示字符串

首选我们使用本章学习的新内容来完成题目;

装载程序代码如下:

assume cs:code

data segment
	db "welcome to masm!", 0
data ends

code segment
	    start:mov ax, cs
		  mov ds, ax
		  mov si, offset show
		  
		  mov ax, 0
		  mov es, ax
		  mov di, 200h
		  
		  mov cx, offset showend - offset show
		  cld           ;传输方向为正
		  rep movsb
		  
                  ;设置中断向量表,使7cH条目中断向量指向0000:200H
		  mov ax, 0
		  mov es, ax
		  mov word ptr es:[7ch*4], 200h
		  mov word ptr es:[7ch*4+2], 0h
	
		  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
		  
		  mov ax, 4c00h
		  int 21h
		  
code ends
end start

安装例程7ch, 入口参数:dh-行数、dl-列数、cl-字符属性:

    show:         push ax
		  push bx
		  push cx
		  push dx
		  push si
		  mov ch, 0
		  push cx
		  
		  
	     s1:  mov ah, 2		;置光标
		  mov bh, 0
		  int 10h
		  
	      mov ah, 9
		  mov al, cl
		  mov cl, [si]
		  mov ch, 0h
		  jcxz ok
		  mov al, cl
		  pop cx
		  mov bl, cl
		  mov bh, 0
		  push cx
		  mov cx, 1
		  int 10h
		  inc si	
		  inc dl
		  jmp short s1
		  
	      ok: pop si
		  pop dx
		  pop cx
		  pop bx
		  pop ax
		  iret
		  
		  mov ax, 4c00h
		  int 21h
        showend:nop

程序执行结果:

现在我们使用直接操纵显示缓冲区的方时来实现一次,装载程序不变,只修改安装例程,代码如下:

assume cs:code

data segment
	db "welcome to masm!", 0
data ends

code segment
	    start:mov ax, cs
		  mov ds, ax
		  mov si, offset show
		  
		  mov ax, 0
		  mov es, ax
		  mov di, 200h
		  
		  mov cx, offset showend - offset show
		  cld
		  rep movsb
		  
		  mov ax, 0
		  mov es, ax
		  mov word ptr es:[7ch*4], 200h
		  mov word ptr es:[7ch*4+2], 0h
	
		  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
		  
	    show: push ax
		  push bx
		  push cx
		  push dx
		  push si
		  push di
		  
		  mov ah, 2		;置光标
		  mov bh, 0
		  int 10h
		  mov dl, 02h
		  mov ax, 0b800h
		  mov es, ax
		  mov di, 10*160+10*2	;每个字符占两个字节(低字节存放数值,高字节存放字符属性值)
		  
	     s1:  mov ch, 0
		  mov cl, [si]
		  jcxz ok
		  mov es:[di], cl
		  mov es:[di+1], dl
		  inc si	
		  add di, 2
		  jmp short s1
		  
	      ok: pop di
		  pop si
		  pop dx
		  pop cx
		  pop bx
		  pop ax
		  iret
		  
		  mov ax, 4c00h
		  int 21h
 showend:nop
code ends
end start

执行结果为:

第二种做法中首选使用10h中断处理程序中的2号子程序重置光标,然后再例程中显示出来(再次制定了行和列),因此个人感觉,题目还是想考察读者对于本章中断的使用,不过两种都能想到使用,知识面才能拓展更宽!

扫描二维码关注公众号,回复: 7599718 查看本文章

猜你喜欢

转载自blog.csdn.net/zhaixh_89/article/details/101673264