assume cs:code
data segment
db 'welcome to masm!'
db 42H,07H,71H
data ends
stack segment
db 8 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10H
mov ax,0b800H
mov es,ax
mov si,10H ;字符属性所在的地址
;确认了地址,开辟了栈空间,接下来是进行循环。
;cmd屏幕在清空条件下,大概12~13行居中,一行160个字节,故160*12+((160-16)/2)为正中央,即1992H
mov bx,1980 ;后续操作是把数据写入es:[bx],所以这里是十进制的偏移地址
mov cx,3 ;总共写入三行
s: push cx ;保存外层循环的循环数
mov di,0 ;初始化偏移地址
mov cx,16 ;每行写入16个字符
output: mov al,[di] ;将字符从ds:[di]写入es:[bx]
mov es:[bx],al ;初始为1992
mov ah,[si] ;将字符属性从ds:[si]写入es:[bx+1]
mov es:[bx+1],ah ;初始为1993
inc di ;di+1,写入下一个字符
add bx,2 ;1992+2为下一个字符
loop output
;内层循环结束后,将跳转到下一行,初始地址为es:[bx+128]
add bx,128
inc si ;更换字符属性
pop cx ;取出外层循环的循环数
loop s
mov ax,4c00h
int 21h
code ends
end start
首先需要debug一下
使用g指令