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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值