要求

收集数据
颜色

所以:
绿色(默认黑底):02h
绿底红色:24h
白底蓝色:71h
确定行起点(es),行内偏移量
es位置:
25行中,让3行显示在中间,就是上下各11个空行,又因每页缓冲区为80\2\25=4000字节,显存缓冲区起点为B800,所以:
es = b800*10h 加上 802 \11 得 b800:06e0,也就是b86e的段地址
行偏移:
因为要打印的为16字符,每个字符会占2字节,就是32字节。又一行有160字节 (160-32)/2 = 64字节 = 40h
注:40h作为idata即可,
代码
assume cs:code, ds:data, ss:stack
data segment
    db 'welcome to masm!'
    db 02h, 24h, 71h
data ends
stack segment
    dw 6 dup(0) ;申请6个word的栈空间,用于保存循环变量用
stack ends
code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, stack
    mov ss, ax
    mov sp, 0eh ;空栈栈顶
    mov ax, 0b86eh ;要打印行的段起点
    mov es, ax
    mov cx, 3h ;3行
    mov si, 10h ;循环颜色,ds偏移量
s1:
    push cx
    mov bx, 0 ;每行从头循环字符
    mov cx, 10h ;内循环16次拷贝ds区域到显存缓冲区行
    mov di, 0 ; 索引列
    s2:    
        mov ax, 0
        mov al, [bx]
        mov ah, ds:[si]
        mov es:[40h+di],ax
        inc bx;
        add di, 2 ;下一列需要移动2个字节
        loop s2
    inc si ;si切换到下1个颜色
    ; es切换到下一行
    mov ax, es
    add ax, 0ah ;+160字节到下一行,段地址需要除以16再相加
    mov es, ax
    pop cx
    loop s1
    mov ax, 4c00h
    int 21h
code ends
end start
结果











