实验报告

实验题目

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

实验目的

《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握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色方式下的属性字节

图3 - 16种颜色的组合

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

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

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

图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子程序实现清屏操作,为显示下一样式的彩色字符做准备。

图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

运行时截图

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

动态显示姓名--汇编语言版相关推荐

  1. STC8H8K系列汇编和C51实战——实现键控不同方式数码管动态显示(C51版和汇编版)

    51和汇编分别实现键控不同方式数码管动态显示 前言 一.实验名称 二.实验内容与要求 三.代码 1.51部分 2. 汇编部分 总结 系列文章--STC8H8K系列汇编51实战 前言 个人对这个实验的汇 ...

  2. 单片机STC89C52RC实现矩阵键盘(汇编语言版)

    单片机型号:STC 89C52RC 引脚如图: 接线方法:4X4矩阵键盘,每行接P3.0-P3.3引脚,每列接P3.4-P3.7引脚,8个LED发光二极管接P1.0-P1.7,用于显示当前按下的键盘序 ...

  3. 整数n分解成素数乘积c语言,用C语言和汇编语言实现将1个整数分解成几个素数的乘积...

    任何1个大于2的整数都可以分解成几个素数的乘积.将1个整数分解成几个素数的乘积是个热门话题. 经常有人问到.本文试图用C语言和32位X86汇编语言给出一个比较好的实现.希望对c语言学习者和 汇编语言学 ...

  4. STC8H8K系列汇编和C51实战——秒倒计时器(可自行设定初值)(51版)

    秒倒计时器(可自行设定初值)(51版) 一.题目 二.代码 总结 系列文章--STC8H8K系列汇编51实战 一.题目 在实验箱上利用单片机定时器/计数器(工作于中断方式)设计一个秒倒计时器,用数码管 ...

  5. STC8H8K系列汇编和C51实战——秒倒计时器(51版)

    秒倒计时器(51版) 一.题目 二.代码 总结 系列文章--STC8H8K系列汇编51实战 一.题目 在实验箱上利用单片机定时器/计数器(工作于中断方式)设计一个秒倒计时器,用数码管显示秒数,从100 ...

  6. “我的开源项目被大厂‘盗用’了!”

    整理 | 苏宓 出品 | CSDN(ID:CSDNnews) UNIX 的命名者 Brian W. Kernighan:开源是一件非常好的事情,它对软件行业的发展至关重要(现在几乎所有东西都和开源有关 ...

  7. hello world漫游

    Hello world漫游 在进入我们今天的主题之前,我想回顾一下冯诺依曼体系结构以及存储程序思想.太经典了! 1计算机是由运算器,控制器,存储器,输入输出设备五部分组成 2采用存储程序的方式,要执行 ...

  8. win32编程的经典书籍

    因为要经典,不敢写得太多,欢迎大家继续补充.这里只是涉及编程的东东,如果想要关于破解方面的资料请到"工具下载"栏目的置顶帖.  ps.网上这些书的电子版大都是未经作者同意而发布的, ...

  9. 项目二:LED点阵实验

    摘要: 本项目以AT89C52为基础,使用74HC138和74HC595控制8*8LED点阵显示拟定的内容,可以进行和静态显示和动态显示,并能够控制显示的方向,同时使用lcd1602作为辅助功能,显示 ...

  10. STC8H8K系列汇编和C51实战——双中断控制定时器流水灯

    双中断控制定时器流水灯 一.题目 二.代码 总结 系列文章--STC8H8K系列汇编51实战 一.题目 1.设计一个流水灯, 流水灯初始时间间隔为500ms.用外部中断0延长间隔时间,上限值为2s;用 ...

最新文章

  1. Bzoj4558 [JLoi2016]方
  2. 节能电磁无线电导航信号放大电路 150kHz制版
  3. 使用VC++绘制坐标系
  4. 震惊!html文件注释也会影响运行代码!(werkzeug.routing.BuildError: Could not build url for endpoint)莫名其妙
  5. SAP常用T-Code
  6. react-github案例
  7. PHP nodejs session,Nodejs中session的简单使用及通过session实现身份验证的方法
  8. Unity 连接MySql数据库
  9. 取消浏览器的默认样式
  10. Android9王者荣耀卡顿,王者荣耀卡顿掉帧?教你如何让王者荣耀流畅爆表
  11. 任意直流电压的多通道数据采集与独立测量,只需要一个模块
  12. WebRoot与WebContent的区别
  13. 三国群英传服务器端架设修改,三国群英传OL单机架设视频教程
  14. 手把手教你一小时设计基于matlab的信号发生器GUI界面(1)
  15. 深度学习优化算法的总结与梳理(从 SGD 到 AdamW 原理和代码解读)
  16. linux 下建立硬链接和软连接
  17. H3C SNMPv3 配置
  18. linux Centos 7 安装hadoop3.1.3 详解
  19. map的valu增加算法
  20. 【JZOJ A组】C

热门文章

  1. dockerfile
  2. python 以图搜图1688_python 以图搜图
  3. Windows10+clion+opencv时报错0xC0000139和0xC0000135的解决方法之一
  4. windows_clion_Process finished with exit code -1073741515 (0xC0000135)
  5. 【绘制关系网络图】Gephi 入门使用
  6. [BZOJ 3654] 图样图森破
  7. xp计算机无法正常启动,修复WindowsXP系统无法正常启动
  8. 华为防火墙忘记密码,使用console口更改密码
  9. CSDN改变图片大小
  10. 疼痛共情ERP成分解析