多个功能子程序的中断例程测试程序
王爽汇编语言
实验16 编写包含多个功能子程序的中断例程 测试程序
一、实验要求
1、完全测试实验16中断例程17ch的所有功能,包含清屏、改变前景色、改变背景色、向上滚动一行
2、用一个菜单来提示用户输入
3、通过判断用户输入的命令来调用响应的子过程
二、分析
1、输出菜单
定义一个数据段,存放菜单内容的几个以‘$'为结尾的字符串,然后定义一个直接定址表,存放菜单各字符串的首地址,通过调用10号中断的2号功能改变光标地址,调用21号中断的9号功能输出字符串,通过循环输出全部菜单
2、获取用户输入
定义一个表来存放测试的各个子过程的首地址,调用16号中断的0号功能来获取键盘缓冲区的数据,该数据减去30h把ascii值转换为功能的序号,通过该序号查表获得子过程的首地址,调用即可实现功能选择
3、清屏和向上滚动一行
直接调用安装的7ch号中断的0号功能和3号功能
4、改变前景色和背景色
在数据段中定义两个8位内存空间,分别用来存放前景色和背景色值。每次调用改变颜色的子程序,对该值增1,然后对这个数模除8,获得一个0-7的值,作为颜色值传入,调用7ch号中断的1号和2号功能
三、详细设计
assume cs:code,ds:data
data segment
d1 db "0.Clear screen.",'$'
d2 db "1.Set Foreground.",'$'
d3 db "2.Set Background.",'$'
d4 db "3.Scroll up a line.",'$'
d5 db "4.Exit.",'$'
foreground db 0 ;这里保存前景色值,每次执行改变前景色命令后该值增1
background db 0 ;然后模除8,获得一个0-7的颜色值
menu dw d1,d2,d3,d4,d5 ;通过该表找到字符串入口地址
number dw do0,do1,do2,do3,do4 ;通过该表找到获取用户输入以后的入口地址
color dw foreground,background ;通过该表查找颜色值
data ends
code segment
start:
call print ;输出菜单
call do3 ;向上滚动一行
call stest ;进入测试过程,开始接受键盘输入
stest:
;获取键盘输入
mov ah,0
int 16h
;ascii值转换为序号
mov ah,30h
sub al,ah
mov ah,0
mov bx,ax ;保存到bx中
;判断数值的合法性
cmp bx,0
jb stest
cmp bx,4
ja stest
;通过数值找到处理子过程入口并转移
add bx,bx
call word ptr number[bx]
jmp short stest
;子程序:清屏
do0:
mov ah,0
int 7ch
ret
;子程序:改变前景色
do1:
mov bx,color[0] ;通过颜色表找到前景色的内存地址
mov al,ds:[bx] ;读出颜色值,增加1后再写入
inc al
mov ds:[bx],al
call rem ;调用rem模除8
mov ah,1 ;调用7ch号中断设置前景色
int 7ch
ret
;子程序:改变背景色
do2:
mov bx,color[1]
mov al,ds:[bx]
inc al
mov ds:[bx],al
call rem
mov ah,2
int 7ch
ret
;子程序:向上滚动一行
do3:
mov ah,3
int 7ch
ret
;子程序:返回操作系统
do4:
mov ax,4c00h
int 21h
ret
;子程序:除以8取余
;参数:al存放要取余的数
;返回值:al存放余数
rem:
push bx
push ax
mov ah,0
mov bl,8
div bl
mov bl,ah
pop ax
mov al,bl
pop bx
ret
;子程序:向屏幕输出菜单
print:
;清屏
call do0
mov ax,data
mov ds,ax
mov cx,5
print_s:
;置光标
mov ah,2
mov bh,0
mov dh,9 ;计算显示的行数 (行数)=4-循环剩余次数+5=9-循环剩余次数
sub dh,cl
add dh,dh
mov dl,30 ;列数
int 10h
;打印字符串
mov dx,cx ;字符串在表中的位置=5-循环剩余次数
mov bx,5
sub bx,dx
add bx,bx
mov dx,menu[bx]
mov ah,9
int 21h
loop print_s
;返回
ret
code ends
end start