多个功能子程序的中断例程测试程序

王爽汇编语言
实验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

posted @ 2010-03-28 08:39  石莹  阅读(431)  评论(0编辑  收藏  举报