一、实验目的
掌握汇编编程规范,熟悉编程环境。
二、实验内容
编程:参考教材实验9,在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串’welcome to masm’。
三、实验步骤算法及关键代码
1.补充:实验9中材料相关内容
80x25彩色字符模式显示缓冲区的结构:
内存地址空间中,B8000H-BFFFFH共32K空间为彩色字符模式的显示缓冲区,在这个模式下,显示器可以显示25行,每行80个字符,每个字符可以有256个属性;一个字符在显示缓冲区中需要占用两个字节,分别存放字符的ASCII码和属性;
属性字节的格式
7 6 5 4 3 2 1 0
含义 BL R G B I R G B
闪烁 背景 高亮 前景
R:红色
G:绿色
B:蓝色
2.实验思路与算法
①思路:
首先按照实验要求,整个操作要在显示缓冲区下进行,因此将DS设置成显示缓冲区的段地址B800H,然后针对数据区的字符,设置记录偏移地址的寄存器,再循环按照隔一跳一的方式,前一个将数据区的数据以ASCII码形式传入,偏移地址加一,然后后一个以二进制属性字节的方式设置属性值。
②相关设置与算法:
本实验中需要重复三次操作,每次操作需要分别设置绿色,绿底红色,白底蓝色的字符串,因此只讨论绿底红色的字符串的做法。
设置DS为显示缓冲区的段地址B800H,ES为数据段data的段地址;
设置CX为循环计数器,初始化为字符串的长度;
设置BX为指向当前操作字符的偏移地址的指针,初始化为0;SI为指向当前操作存储单元的偏移地址的指针,初始化为屏幕中间的偏移地址(如07C0H);
设置DX为属性字节,根据条件进行设置,如绿底红字为00011000B
每次循环时,首先将数据区的单个字符取出并传送给当前显示缓冲区的地址,然后SI加一,将属性值传送给当前显示缓冲区的偏移地址,再SI,BX加一,完成一次循环
3.实验代码
ASSUME CS:CODES
DATA SEGMENT
DB 'welcome to masm'
DATA ENDS
CODES SEGMENT
START:
;02H为黑底绿色,24H为绿底红色,71H为白底蓝色
;将显示器段地址赋到DS中
MOV AX,0B800H
MOV DS,AX
;将data数据所在段段地址赋到ES中
MOV AX,DATA
MOV ES,AX
;设置BX为0,用于ES寻址
MOV BX,0
;设置CX循环次数
MOV CX,15
;定义位置的偏移地址
;将偏移地址02H赋到SI中
MOV SI,0720H
MOV DH,02H
S1:MOV AH,ES:[BX]
MOV [SI],AH
INC SI
MOV [SI],DH
INC SI
INC BX
LOOP S1
;设置BX为0,用于ES寻址
MOV BX,0
;设置CX循环次数
MOV BX,0
MOV CX,15
;定义位置的偏移地址
;将偏移地址24H赋到SI中
MOV SI,07C0H
MOV DH,24H
S2:MOV AH,ES:[BX]
MOV [SI],AH
INC SI
MOV [SI],DH
INC SI
INC BX
LOOP S2
;设置BX为0,用于ES寻址
MOV BX,0
;设置CX循环次数
MOV BX,0
MOV CX,15
;定义位置的偏移地址
;将偏移地址24H赋到SI中
MOV SI,0860H
MOV DH,71H
S3:MOV AH,ES:[BX]
MOV [SI],AH
INC SI
MOV [SI],DH
INC SI
INC BX
LOOP S3
MOV AH,4CH
INT 21H
CODES ENDS
END START
4.实验结果
四、实验小结(简单说明实验过程中出现的问题和解决方法)
本次实验为看材料编程,整体实验的难度较第一个实验就有所上升了,且需要阅读教材中实验九的相关材料提取信息,整个实验中考查了有关数据段data的使用,寄存器间接寻址,复杂问题多寄存器求解以及对这个题特有的设置两个指针的思想,针对数据段的数据和显示缓冲区的地址都需要进行指向。整体实验在做的过程中需要比较熟悉循环语句的用法,间接寻址与计数器结合的方法等。
在做这次实验中,首先把我难到的就是材料的阅读了,花费了我一定的时间去理解显示缓冲区的属性等方法的使用,当然这个其实是读通了就理解了,但在这个实验中,求取中心位置,设置两个寄存器指向两个地方这个思路在刚开始其实没有想到,本来想的是设置一个寄存器,指向数据区时不加立即数,指向显示缓冲区时加立即数求得位移,但这个思路经验证行不通,因此采取了两个寄存器的方法,其实也比较方便。整体来说还是收获学习了怎么用一个汇编程序完成显示的方法吧。