动态显示姓名--汇编语言版

实验报告


实验题目

将自己的姓名用多种颜色动态显示


实验目的

《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。


实验要求

实验要求为将自己的姓名用多种颜色动态显示。该实验有两个重点需要把握,一是“多种颜色”,涉及的显示器I/O的相关内容,需要掌握汇编语言中彩色字符的显示,BIOS显示中断的调用等;二是“动态显示”,为了实现字符串的动态显示,则需要进行清屏操作以及时间延迟操作,故需要掌握80x86PC时间延迟的相关知识。


实验原理分析

  1. 首先我们要了解如何调用BIOS显示中断的类型10H的显示操作显示字符串。

                                                                  图1 - 类型10H显示字符串功能调用参数及注释


由图1可知,在调用10H号中断前,我们需要将名字字符串地址对应ES:BP上,CX寄存器存储名字字符串长度,DH存储显示的行号,DL存储显示的列号(假设该实验以25行80列的格式来显示字符),BL存储显示的字符串的颜色,AL存储光标的位置。

为了使字符串显示多种颜色,我们需要了解字符的彩色显示如何储存在BL中,如图2所示,前景(字符)的16种颜色由位0~3组合,RGB分别表示红、绿、蓝,B位7表示闪烁,I为亮度,闪烁和亮度只应用于前景。图3列出了16色字符方式颜色的组合。我们可以根据图3将不同颜色的前景和背景组合在一起,这样就能使得字符串显示多种颜色。

在这里插入图片描述

                                                                             图2 - 16色方式下的属性字节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSv70TIM-1604303670602)(file:///C:/Users/杜仲/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]

                                                                                    图3 - 16种颜色的组合

在设计实验中,采用了12种颜色搭配来显示字符,存储在COLOR地址表当中,COLOR中的具体颜色如图4所示。这些颜色在调用类型10H的中断之前,会存储在BL中,以便实现特定颜色的显示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tr84vYyV-1604303670605)(file:///C:/Users/杜仲/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]

                                                                             图4 - COLOR地址表中存储的颜色

  1. 为了实现多种颜色的动态显示,清屏操作是必不可少的。INT 10H功能6能使屏幕内容上卷指定的行,这个功能需要设置7个参数。如果屏幕的起始行列为(0,0),结束行列为(24,79),那么2580大小的屏幕具有上卷的功能,能实现整个2580大小的窗口清屏的效果。如果AL=0,则实际完成的工作是清除屏幕的功能,它将按AL中的Blank字符(0)使指定的窗口为空白。实现清屏功能的各参数设置如图5所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BoIVMtZ7-1604303670606)(file:///C:/Users/杜仲/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]

                                                                        图5 - 实现清屏功能的各参数设置

  1. 为了实现颜色的动态显示,我们需要实现程序的延时功能,使得字符暂停一定时间后再切换颜色。为了建立一个与处理器无关的时间延迟,IBM采用了一种利用硬件产生时间延迟的方法,及通过监控端口61H的PB4,使PB4每15.08us触发一次,以产生一个固定不变的时间基准。我们在实验中编写了WAITF子程序,是一个能够产生15.08us时间延迟的程序。先设置(CX)=33144(3314415.08us=0.5s),然后调用WAITF子程序,就能够产生0.5s的时间延迟。DELAY子程序通过循环10次0.5s的时间延迟,以实现5s(0.510=5s)的时间延迟,并应用于名字字符串颜色动态显示。

流程图

该实验流程图如图6所示。其中main为入口子程序,show子程序用于各种颜色显示名字字符串,delay子程序用于时间延迟5s,waitf子程序将会延时15.08us,clear_screen子程序实现清屏操作。

程序开始时,程序进入main子程序,mian子程序将会调用show子程序,show子程在显示彩色字符后,会调用delay子程序延时5s,delay子程序的实现则是调用若干次waitf子程序,delay子程序完成后,show子程继续调用clear_screen子程序实现清屏操作,为显示下一样式的彩色字符做准备。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2yXajWeU-1604303670608)(file:///C:/Users/杜仲/AppData/Local/Temp/msohtmlclip1/01/clip_image012.png)]

                                                                             图6 - 程序流程图


源程序

源程序代码:

;Title:   color--name
;Author:  Yuan Xiaoshuai

;--------------------------
DATAS SEGMENT
    ;此处输入数据段代码  
    STRING DB 'Yuan Xiaoshuai' ;名字
    LEN EQU $-STRING
    COLOR DB 07H,70H,41H,20H,4FH,2FH,71H,67H,7EH,7AH,4FH,76H
    ;07H--黑底白字,70H--白底黑字,41H--红底蓝字,20H--绿底黑字
    ;4FH--红底白字,2FH--绿底白字,71H--白底蓝字,67H--棕底白字
    ;7EH--白底黄字,7AH--白底红字,4FH--红底白字,76H--白底棕字
    
    COL DB 0,12,24,36,48,60,0,12,24,36,48,60 ;显示列的序号
    NUM DB $-COL ;NUM=12
DATAS ENDS
;--------------------------

;--------------------------
STACKS SEGMENT
    ;此处输入堆栈段代码
    dw 200 dup(?)
STACKS ENDS
;--------------------------


CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    
;--------------------------
main proc  ;主程序
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    call show  ;调用show多种颜色动态显示名字

    MOV AH,4CH
    INT 21H
main endp
;--------------------------

;--------------------------
show proc  ;多种颜色动态显示名字

	push ax ;保护现场
	push bx
	push cx
	push dx
	
	mov cx,120 ;120/12=10 循环显示10次效果
	mov si,0
	
display:
	push cx
	
	mov al,3 ;选择80*25的文本
	mov ah,0 ;切换模式
	int 10h
	
	mov bp,seg string
	mov es,bp
	mov bp,offset string ; es:bp为串地址
	
	mov cx,len ;串长度
	;mov dx,0
	mov dh,10  ;显示在第10行
	mov dl,col[si]   ;显示在第 col[si] 列
	
	mov bl,color[si] ;显示的颜色
	mov al,0 ;光标返回起始位置
	mov ah,13h ;显示名字
	int 10h ;调用BIOS
	
	call delay ;延时
	call clear_screen ;清屏
	
	pop cx
	
	inc si
	cmp si,12 
	jnz jmp1
	sub si,12 ;保证下标在[0,11]间
	
jmp1:
	loop display
	
	pop dx ;恢复现场
	pop cx
	pop bx
	pop ax
	
	ret
show endp
;--------------------------


;--------------------------
waitf proc  ;延时15.08us
	push ax
waitf1:
	in al,61h
	and al,10h ;检查PB4
	cmp al,ah
	je waitf1 ;循环等待15.08us
	mov ah,al
	loop waitf1
	pop ax
	ret
waitf endp
;--------------------------

;--------------------------
delay proc ;延时 10*(33144*15.08us)=5s
	push cx
	push dx
	
	mov dx,10
rep1:
	mov cx,33144 ;(33144*15.08us)=0.5s
	call waitf
	dec dx
	jnz rep1
	
	pop dx
	pop cx
	
	ret
delay endp
;--------------------------

;--------------------------
clear_screen proc ;清屏子程序
	push ax ;保存现场
	push bx
	push cx
	push dx
	
	mov ah,6
	mov al,0
	mov bh,7
	mov ch,0 ;最上
	mov cl,0 ;最左
	mov dh,24 ;最下
	mov dl,79 ;最右
	int 10h  ;调用video BIOS
	
	mov dx,0 
	mov ah,2 ;定位光标
	int 10h ;调用video BIOS
	
	pop dx ;恢复现场
	pop cx
	pop bx
	pop ax
	
	ret
clear_screen endp
;--------------------------

CODES ENDS
    END main

运行时截图

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述



最后感谢小伙伴们的学习噢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Wedream__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值