汇编-实验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