**编程,在屏幕中间分别显示绿色、红底绿色、白底蓝色的
字符串‘Welcome to masm!’。**
ASSUME CS:CODE,DS:DATA,SS:STACK
;------------------------------------------------------------
;------------------------------------------------------------
DATA SEGMENT
DB 'WELCOME TO MASM!'
COLOR DB 00000010B,00100100B,01110001B
DATA ENDS
;------------------------------------------------------------
;------------------------------------------------------------
STACK SEGMENT
STACK ENDS
;------------------------------------------------------------
;------------------------------------------------------------
CODE SEGMENT
START:
MOV AX,DATA ;初始化DS
MOV DS,AX
MOV AX,0B800H ;初始化(ES)=显示缓冲区段地址
MOV ES,AX
MOV SI,0720H ;0720H=11行的偏移地址
MOV CX,3 ;(CX)=外层循环次数(显示行数)
MOV DI,OFFSET COLOR ;(DI)=所需颜色的偏移地址
PRINT:
PUSH CX
MOV CX,16 ;(CX)=内层循环次数(字符个数)
MOV BX,0 ;(BX)=字符的位置
S:
MOV AL,[BX] ;(AL)=字符
PUSH AX
MOV AX,BX ;计算显示缓冲区中的偏移地址
MOV DL,2
MUL DL
MOV BP,AX ;(BP)=显示缓冲区中的偏移地址
POP AX ;恢复(AL)=字符
MOV ES:[BP+SI],AL ;送入字符到缓冲区
MOV AX,[DI] ;获取颜色
MOV ES:[BP+SI+1],AL ;送出颜色到缓冲区
INC BX ;准备输出下一个字符
LOOP S ;输出下一个字符
POP CX ;恢复外层循环次数
;DEC CX
ADD SI,0A0H ;显示缓冲区偏移地址到下一行的中间
INC DI ;下一行颜色的偏移地址
LOOP PRINT ;输出下一行
MOV AH,07H ;获取键盘输入(无回显),获得显示结果用
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
;------------------------------------------------------------
;------------------------------------------------------------