汇编-实验9

一、编程目标:

在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

二、程序分析

在屏幕中显示字符即是向显示缓冲区的对应区域写入字符。

1、定位屏幕输出位置

字符串长度为16,屏幕每行总共为80个字符的输出宽度。要使得居中,则字符左右要各空32个字符位置。即字符串首字符位于每行的第33个字符位,字符串占第33列到第48列。

屏幕每页为25行,输出目标为3行,即三个字符串占第12、13、15行。

即第一个字符串在显示缓冲区内起始位置为:(B8000H+11*80*2+32*2);

第二行的起始地址为在第一行基础上加上80*2;

第三行类推。

2、字符信息的设置

字符本身的写入可通过每行分别写入单个字符,也可以设置一个数据段存放原始字符串,通过loop指令逐个写入。

字符属性是单个字符占据两字节中的高字节部分,可在写入时候逐个写入,但通过loop指令更方便。

3、思路

设置一个数据段,存放原始字符串。

设置一个数据段,存放各行的属性值。

对每行进行循环,赋值原始字符串,并写入该行属性值,共16次。更新目标区域及相关数值,进行下一行的循环,类推,共计3次。

三、程序代码

assume cs:code,ds:string,es:color,ss:stack
string segment
    db 'welcome to masm!'
string ends

color segment
    db 2,36,113
color ends

stack segment
    db 16 dup (0)
stack ends

code segment
start:
    mov ax,string
    mov ds,ax
    mov bx,0         ;初始指向string首地址
    mov si,16         ;初始指向color首地址

    mov ax,stack
    mov ss,ax
    mov sp,16         ;设置初始栈顶指向

    mov ax,0b800h 
    mov es,ax
    mov bp,0720h         ;设置首行字符串首地址
    mov cx,3

s1:
    mov di,0         ;游标初始指向写入区每行首地址
    push cx             ;保护外循环数
    mov cx,16
s2:
    mov al,[bx]
    mov es:[bp+di],al
    mov al,[si]
    mov es:[bp+di+1],al
    add di,2          ;指向写入区下一字符
    inc bx              ;指向读入区下一字符
    loop s2

    mov bx,0          ;每次循环初始指向string首地址
    inc si              ;指向字符属性区下一属性
    add bp,160          ;指向下一写入行首

    pop cx              ;取出外循环数
    loop s1

    mov ax,4c00h
    int 21h

code ends
end start

	
	



原文地址:https://www.cnblogs.com/tsembrace/p/3267150.html