《汇编语言》书p262页(王爽)实验13 编写、应用中断例程
题目要求
一、实验任务书
(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
(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
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
(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 ;将ds也指向了cs段
mov bx, offset s ;(bx)=s标号地址
mov si, offset row ;(si)=row标号的地址。
mov cx, 4 ;计数器置为4,4行字符串
ok: ;在DOS窗口设置光标的位置,
mov bh,0 ;BIOS中的10h中断例程的入口参数设置,bh(页号)=0
mov dh, [si] ;入口参数:dh(行号)=(si)
mov dl, 0 ;入口参数:dl(列数)=0
mov ah, 2 ;10h例程中的2号子程序,功能:设置光标位置。
int 10h ;调用中断例程
;开始显示字符串。调用21h例程,9号子程序
mov dx,[bx] ;入口参数:dx=(bx),每个字符串的首地址。
mov ah,9 ;dos系统中21h例程中的9号子程序
int 21h ;调用中断例程,功能:显示字符串(以$结尾的)
inc si ;si按字节定义的。每次增量是1个字节。
add bx,2 ;bx是按照字定义的,每次增量是2个字节。
loop ok
mov ax,4c00h
int 21h
code ends
end start
算法思路
1、先进行安装中断程序,再进行设置中断向量表,安装中断程序要注意设置指向以及传输的长度、方向,设置int 7ch中断,中断向量表指向为0:200h处。
2、编写程序在屏幕中间显示80个“!”(该程序书上有),此程序中要注意es:di指向的显示空间位置,以及转移地址的计算,设置传输字符的类型和定义。
解题代码
(1)
assume cs:code
code segment
start: ;7cH中断例程的安装程序
mov ax, cs
mov ds, ax
mov si, offset show_str ;将ds:si指向源地址(show_str的机器码)
mov ax, 0000H
mov es, ax
mov di, 200H ;将es:di指向目的地址(0:200H向量表中)
mov cx, offset show_strend - offset show_str ;设置传输长度
cld ;传输方向为正
rep movsb ;字节传输
;设置中断向量表,使7cH条目中断向量指向0000:200H
mov ax, 0000H
mov es, ax
mov word ptr es:[7cH*4], 200H
mov word ptr es:[7cH*4+2], 0000H
mov ax, 4c00H
int 21H
;-------
;装载的例程:7cH
;功能:int 7cH实现按行和列及字符属性显示字符串功能
;入口参数:入口参数:dh-行数、dl-列数、cl-字符属性,ds:si指向data字符串
;返回值:无
;-------
show_str: push dx
push cx
push si ;将子程序用到的寄存器入栈
mov ax, 0b800H
mov es, ax ;设置显示缓冲区内存段
mov ax, 0 ;(ax)= 0,防止高位不为零
mov al, 160 ;0a0H- 160字节/行
mul dh ;相对于0b800:0000第dh行偏移量
mov bx, ax ;将第(dh)行的偏移地址送入bx,bx代表行偏移
mov ax, 0
mov al, 2 ;列的标准偏移量是2个字节
mul dl ;同一行列的偏移量,尽量使用乘法,(al)=列偏移
add bx, ax ;最终获得偏移地址(bx)=506H
mov di,0 ;将di作为每个字符的偏移量
mov al, cl ;将字符属性写入al中
mov ch, 0 ;将cx高8位设置为0
show: mov cl, ds:[si] ;将字符串单个字符读入cl中
jcxz ok ;判断字符串是否为零。
mov es:[bx+di+0], cl ;在显示缓冲区中写入字符
mov es:[bx+di+1], al ;在显示缓冲区中写入字符属性
add di, 2
inc si
jmp short show
ok: pop si ;字符串字符为0,结尾
pop dx
pop cx ;恢复寄存器
iret
show_strend:nop ;代码段结尾,便于计算7cH例程的长度。
code ends
end start
(2)
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset lp ;设置ds:si指向源地址lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset le - 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,0b800h
mov es,ax
mov di,160*12 ;设置es:di指向的显示空间位置
mov bx,offset s- offset se ;设置从标号se到标号s的转移地址
mov cx,80 ;设置cx为字符串长度,即循环次数
s: mov byte ptr es:[di],'!' ;设置要传输的字节,并定义为!
add di,2
int 7ch ;如果(cx)≠0,转移到标号s处
se: nop
mov ax,4c00h
int 21h
lp: push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret: pop bp
iret
le: nop
code ends
end start
(3)
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 ;共需要4行数据
ok:mov bh, 0 ;第0页
mov dh, [si] ;第几行
mov dl, 0 ;第几列
mov ah, 2 ;置光标功能
int 10h ;调用10h号中断处理程序的2号子程序
mov dx, [bx] ;在光标处显示字符串
mov ah, 9 ;调用21h号中断处理程序的9号子程序
int 21h
inc si
add bx, 2 ;dw定义字型数据,增量为2
loop ok
mov ax, 4c00h
int 21h
code ends
end start
实验结果截图
(2)
(3)