思路:可以将色彩信息也储存在附加段,然后在打出每组welcome to masm时将这段信息从内存中取到,追加在字符信息的后边,最后循环三次取色彩的值,完成;
也可以将色彩信息储存在栈中,逆序push后,在打印每组字符串时,逐个pop,pop出来的色彩信息再同字符信息送入buffer。
我选择的是后者,为了减少对内存的访问,并防止reg冲突。
光说不做假把式,来看代码:
char segment
db 'welcome to masm!'
char ends
assume cs:code
code segment
start:mov ax,0b800h
mov ds,ax
mov ax,char
mov es,ax
mov ax,0071h
push ax
mov ax,0024h
push ax
mov ax,0002h
push ax
mov cx,0003h
mov bx,0728h
res:pop ax
mov dx,cx
mov si,0
mov di,0
mov cx,0010h
s:mov ds:[bx+si+1],al //先放色彩再放字符,因为后面借助ax会改变它的值
mov ah,0
push ax
mov al,es:[di]
mov ds:[si+bx],al
add si,2
add di,1
pop ax
loop s
mov cx,dx
add bx,00a0h
loop res
mov ax,4c00h
int 21h
code ends
end start