(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号子程序重置光标,然后再例程中显示出来(再次制定了行和列),因此个人感觉,题目还是想考察读者对于本章中断的使用,不过两种都能想到使用,知识面才能拓展更宽!