汇编语言程序设计实验二

一、实验目的

掌握汇编编程规范,熟悉编程环境。

二、实验内容

编程:参考教材实验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的使用,寄存器间接寻址,复杂问题多寄存器求解以及对这个题特有的设置两个指针的思想,针对数据段的数据和显示缓冲区的地址都需要进行指向。整体实验在做的过程中需要比较熟悉循环语句的用法,间接寻址与计数器结合的方法等。
在做这次实验中,首先把我难到的就是材料的阅读了,花费了我一定的时间去理解显示缓冲区的属性等方法的使用,当然这个其实是读通了就理解了,但在这个实验中,求取中心位置,设置两个寄存器指向两个地方这个思路在刚开始其实没有想到,本来想的是设置一个寄存器,指向数据区时不加立即数,指向显示缓冲区时加立即数求得位移,但这个思路经验证行不通,因此采取了两个寄存器的方法,其实也比较方便。整体来说还是收获学习了怎么用一个汇编程序完成显示的方法吧。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值