一、实验要求: 在屏幕中间分别显示绿色、红底绿色、白底蓝色的welcome to masm!
属性字节格式:
7 6 5 4 3 2 1 0
含义: BL R G B I R G B
闪烁 背景色 高亮 背景色
R:红色
G:绿色
B:蓝色
绿色:0x03
红底绿色:0x24
白底蓝色:0x71
分析:屏幕中间的位置(第一行文字显示的位置):段地址:偏移地址=B800:0760
二、代码实现
assume cs:code,ds:data,ss:stack data segment db 'welcome to masm!' db 2,24h,71h ;三个颜色对应的16进制代码 data ends stack segment dw 8 dup(0) stack ends code segment ;初始化栈段 start: mov ax,stack mov ss,ax mov sp,10h ;初始化数据段 mov ax,data mov ds,ax ;初始化显存段 mov ax,0b800h mov es,ax mov bx,780h ;要显示第一行的起始地址(25行的中间一行的开始位置即第12行的开始位置,12*160=1920=780h) mov si,10h ;定义颜色属性的偏移地址 mov cx,3 ;外层循环处理显示三行数据 s1: mov ah,ds:[si] push cx ;保存循环次数 push si ;保存颜色属性的偏移地址 mov cx,16 ;循环处理要显示的16个字符串 mov si,64 ;要显示的数据相对于这一行的偏移地址(字符串居中的位置) mov di,0 ;数据段数据列的偏移量 ;处理每一行要显示的数据 s2: mov al,ds:[di] ;数据段中的数据存储到ax低位寄存器 mov es:[bx+si],al ;ax低位寄存器数据赋值到es段的偏移地址的单元中 mov es:[bx+si+1],ah ;传递颜色属性 inc di ;data段字符的偏移量,每次加 1 add si,2 ;显示缓存区字符ASCII码偏移量为2 loop s2 pop si pop cx ;准备下一行要显示的数据地址 inc si ;指向下一个颜色 add bx,0a0h ;指向下一行(长度160=a0) loop s1 mov ax,4c00h int 21h code ends end start
三、上机调试
待续