动态显示姓名--汇编语言版
实验报告
实验题目
将自己的姓名用多种颜色动态显示
实验目的
《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
实验要求
实验要求为将自己的姓名用多种颜色动态显示。该实验有两个重点需要把握,一是“多种颜色”,涉及的显示器I/O的相关内容,需要掌握汇编语言中彩色字符的显示,BIOS显示中断的调用等;二是“动态显示”,为了实现字符串的动态显示,则需要进行清屏操作以及时间延迟操作,故需要掌握80x86PC时间延迟的相关知识。
实验原理分析
- 首先我们要了解如何调用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色方式下的属性字节
图3 - 16种颜色的组合
在设计实验中,采用了12种颜色搭配来显示字符,存储在COLOR地址表当中,COLOR中的具体颜色如图4所示。这些颜色在调用类型10H的中断之前,会存储在BL中,以便实现特定颜色的显示。
图4 - COLOR地址表中存储的颜色
- 为了实现多种颜色的动态显示,清屏操作是必不可少的。INT 10H功能6能使屏幕内容上卷指定的行,这个功能需要设置7个参数。如果屏幕的起始行列为(0,0),结束行列为(24,79),那么2580大小的屏幕具有上卷的功能,能实现整个2580大小的窗口清屏的效果。如果AL=0,则实际完成的工作是清除屏幕的功能,它将按AL中的Blank字符(0)使指定的窗口为空白。实现清屏功能的各参数设置如图5所示。
图5 - 实现清屏功能的各参数设置
- 为了实现颜色的动态显示,我们需要实现程序的延时功能,使得字符暂停一定时间后再切换颜色。为了建立一个与处理器无关的时间延迟,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子程序实现清屏操作,为显示下一样式的彩色字符做准备。
图6 - 程序流程图
源程序
源程序代码:
;Title: color--name
;Author: Yuan Xiaoshuai;--------------------------
DATAS SEGMENT;此处输入数据段代码 STRING DB 'Yuan Xiaoshuai' ;名字LEN EQU $-STRINGCOLOR 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 SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS;--------------------------
main proc ;主程序MOV AX,DATASMOV DS,AX;此处输入代码段代码call show ;调用show多种颜色动态显示名字MOV AH,4CHINT 21H
main endp
;--------------------------;--------------------------
show proc ;多种颜色动态显示名字push ax ;保护现场push bxpush cxpush dxmov cx,120 ;120/12=10 循环显示10次效果mov si,0display:push cxmov al,3 ;选择80*25的文本mov ah,0 ;切换模式int 10hmov bp,seg stringmov es,bpmov bp,offset string ; es:bp为串地址mov cx,len ;串长度;mov dx,0mov dh,10 ;显示在第10行mov dl,col[si] ;显示在第 col[si] 列mov bl,color[si] ;显示的颜色mov al,0 ;光标返回起始位置mov ah,13h ;显示名字int 10h ;调用BIOScall delay ;延时call clear_screen ;清屏pop cxinc sicmp si,12 jnz jmp1sub si,12 ;保证下标在[0,11]间jmp1:loop displaypop dx ;恢复现场pop cxpop bxpop axret
show endp
;--------------------------;--------------------------
waitf proc ;延时15.08uspush ax
waitf1:in al,61hand al,10h ;检查PB4cmp al,ahje waitf1 ;循环等待15.08usmov ah,alloop waitf1pop axret
waitf endp
;--------------------------;--------------------------
delay proc ;延时 10*(33144*15.08us)=5spush cxpush dxmov dx,10
rep1:mov cx,33144 ;(33144*15.08us)=0.5scall waitfdec dxjnz rep1pop dxpop cxret
delay endp
;--------------------------;--------------------------
clear_screen proc ;清屏子程序push ax ;保存现场push bxpush cxpush dxmov ah,6mov al,0mov bh,7mov ch,0 ;最上mov cl,0 ;最左mov dh,24 ;最下mov dl,79 ;最右int 10h ;调用video BIOSmov dx,0 mov ah,2 ;定位光标int 10h ;调用video BIOSpop dx ;恢复现场pop cxpop bxpop axret
clear_screen endp
;--------------------------CODES ENDSEND main
运行时截图
最后感谢小伙伴们的学习噢~
动态显示姓名--汇编语言版相关推荐
- STC8H8K系列汇编和C51实战——实现键控不同方式数码管动态显示(C51版和汇编版)
51和汇编分别实现键控不同方式数码管动态显示 前言 一.实验名称 二.实验内容与要求 三.代码 1.51部分 2. 汇编部分 总结 系列文章--STC8H8K系列汇编51实战 前言 个人对这个实验的汇 ...
- 单片机STC89C52RC实现矩阵键盘(汇编语言版)
单片机型号:STC 89C52RC 引脚如图: 接线方法:4X4矩阵键盘,每行接P3.0-P3.3引脚,每列接P3.4-P3.7引脚,8个LED发光二极管接P1.0-P1.7,用于显示当前按下的键盘序 ...
- 整数n分解成素数乘积c语言,用C语言和汇编语言实现将1个整数分解成几个素数的乘积...
任何1个大于2的整数都可以分解成几个素数的乘积.将1个整数分解成几个素数的乘积是个热门话题. 经常有人问到.本文试图用C语言和32位X86汇编语言给出一个比较好的实现.希望对c语言学习者和 汇编语言学 ...
- STC8H8K系列汇编和C51实战——秒倒计时器(可自行设定初值)(51版)
秒倒计时器(可自行设定初值)(51版) 一.题目 二.代码 总结 系列文章--STC8H8K系列汇编51实战 一.题目 在实验箱上利用单片机定时器/计数器(工作于中断方式)设计一个秒倒计时器,用数码管 ...
- STC8H8K系列汇编和C51实战——秒倒计时器(51版)
秒倒计时器(51版) 一.题目 二.代码 总结 系列文章--STC8H8K系列汇编51实战 一.题目 在实验箱上利用单片机定时器/计数器(工作于中断方式)设计一个秒倒计时器,用数码管显示秒数,从100 ...
- “我的开源项目被大厂‘盗用’了!”
整理 | 苏宓 出品 | CSDN(ID:CSDNnews) UNIX 的命名者 Brian W. Kernighan:开源是一件非常好的事情,它对软件行业的发展至关重要(现在几乎所有东西都和开源有关 ...
- hello world漫游
Hello world漫游 在进入我们今天的主题之前,我想回顾一下冯诺依曼体系结构以及存储程序思想.太经典了! 1计算机是由运算器,控制器,存储器,输入输出设备五部分组成 2采用存储程序的方式,要执行 ...
- win32编程的经典书籍
因为要经典,不敢写得太多,欢迎大家继续补充.这里只是涉及编程的东东,如果想要关于破解方面的资料请到"工具下载"栏目的置顶帖. ps.网上这些书的电子版大都是未经作者同意而发布的, ...
- 项目二:LED点阵实验
摘要: 本项目以AT89C52为基础,使用74HC138和74HC595控制8*8LED点阵显示拟定的内容,可以进行和静态显示和动态显示,并能够控制显示的方向,同时使用lcd1602作为辅助功能,显示 ...
- STC8H8K系列汇编和C51实战——双中断控制定时器流水灯
双中断控制定时器流水灯 一.题目 二.代码 总结 系列文章--STC8H8K系列汇编51实战 一.题目 1.设计一个流水灯, 流水灯初始时间间隔为500ms.用外部中断0延长间隔时间,上限值为2s;用 ...
最新文章
- Bzoj4558 [JLoi2016]方
- 节能电磁无线电导航信号放大电路 150kHz制版
- 使用VC++绘制坐标系
- 震惊!html文件注释也会影响运行代码!(werkzeug.routing.BuildError: Could not build url for endpoint)莫名其妙
- SAP常用T-Code
- react-github案例
- PHP nodejs session,Nodejs中session的简单使用及通过session实现身份验证的方法
- Unity 连接MySql数据库
- 取消浏览器的默认样式
- Android9王者荣耀卡顿,王者荣耀卡顿掉帧?教你如何让王者荣耀流畅爆表
- 任意直流电压的多通道数据采集与独立测量,只需要一个模块
- WebRoot与WebContent的区别
- 三国群英传服务器端架设修改,三国群英传OL单机架设视频教程
- 手把手教你一小时设计基于matlab的信号发生器GUI界面(1)
- 深度学习优化算法的总结与梳理(从 SGD 到 AdamW 原理和代码解读)
- linux 下建立硬链接和软连接
- H3C SNMPv3 配置
- linux Centos 7 安装hadoop3.1.3 详解
- map的valu增加算法
- 【JZOJ A组】C
热门文章
- dockerfile
- python 以图搜图1688_python 以图搜图
- Windows10+clion+opencv时报错0xC0000139和0xC0000135的解决方法之一
- windows_clion_Process finished with exit code -1073741515 (0xC0000135)
- 【绘制关系网络图】Gephi 入门使用
- [BZOJ 3654] 图样图森破
- xp计算机无法正常启动,修复WindowsXP系统无法正常启动
- 华为防火墙忘记密码,使用console口更改密码
- CSDN改变图片大小
- 疼痛共情ERP成分解析