assume cs:code
data segment
db 'Welcome to masm!',0
data ends
code segment
start:
mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
push ax ;show_str 改变了这些寄存器的值,所以要提前入栈,把寄存器的值保存起来
push cx
push es
push si
push di
mov di,0 ;根据dh和dl的值算出显存(起始B800H)的偏移地址di的值
mov ah,0
mov al,160
mul dh
add di,ax
mov ah,0
mov al,2
mul dl
add di,ax
mov ax,0b800h ;es寄存器存储显存的起始地址(B800H)
mov es,ax
mov ah,cl ;因为后面会把data处的字符存储进cx,提前把字符属性cl存入ah
mov ch,0
change:mov cl,[si] ;把data处的字符存入cx,判断cx的值是否为0,不为0才进行接下去的操作,否则准备结束子程序
jcxz ok
mov al,[si] ;每次把data处的字符存入al
mov es:[di],ax ;把al中的字符值和ah中的字符属性一并存入显存
inc si
add di,2
jmp short change
ok:pop di ;show_str 快结束前把压进栈的寄存器值取出来,注意先入栈的要后出栈
pop si
pop es
pop cx
pop ax
ret
code ends
end start