题目: 编程, 在屏幕蹭分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'。

答:

assume cs:code,ds:data

data segment
    db 'welcome to masm!'   ; 声明需要显示的文字内容
    db 2,36,113             ; 声明3种颜色,如果需要打印更多颜色可以直接添加,并修改下面cx,3与这里的颜色数量相同
data ends

stack segment
    db 16 dup (0)   ; 声明16个字节的栈空间
stack ends

code segment
start:
    mov ax,0B800H   ; 0B800H~0BFFFHF共32K空间为80x25彩色字符显示缓冲区
    mov es,ax

    mov ax,data
    mov ds,ax

    ; 遍历3种颜色,输出三行文字
    mov di,0
    mov cx,3
    mov bp,0
s:
    mov ah,ds:16[di]
    push cx

    ; 为了把字符打印到屏幕中央, 把前32字单元填充上空值,不显示内容
        mov si,0
        mov cx,32
    s0:
        mov word ptr es:[si][bp],0000H
        add si,2
    loop s0

    ; 从屏幕中间开始打印文字, 共16个字符
        mov bx,0
        mov cx,16
    s1:
        mov byte ptr al,ds:[bx]         ; 从ds段中取出需要的字符
        mov byte ptr es:[si][bp],al     ; 向缓冲区输入字符
        mov byte ptr es:[si][bp][1],ah  ; 向缓冲区输入颜色

        
        add si,2
        inc bx
    loop s1

    ; 屏幕后32字单元填充上00数据,清空后面的屏幕内容
        mov cx,32
    s2:
        mov word ptr es:[si][bp],0000H
        add si,2
    loop s2

    pop cx      ; 恢复最外层的,颜色遍历计数
    inc di      ; 颜色偏移位置加一个字节
    add bp,160  ; 屏幕行数加1 = 缓冲偏移地址+160个字节
loop s
    
; 保持程序不退出, 以方便查看输出的内容
sss:
    mov cx,5
loop sss

    mov ax,4c00h
    int 21h
code ends

end start