;编写一个通用的子程序实现这个显示字符串的功能,提供灵活的调用接口,使调用者
;可以决定显示的位置,内容,颜色
assume cs:code,ss:stack,ds:data
data segment
db 'welcome to masm!',0 ;要显示的字符串
data ends
stack segment
db 128 dup (0)
stack ends
code segment
start: mov dh,23 ;行数
mov dl,10 ;列数
mov cl,4 ;颜色
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,128
mov si,0
call show_str
mov ax,4c00h
int 21h
;------------------------------
show_str:
push cx
push dx
mov bx,0b800h ;显示地址
mov es,bx
;---------------------------------
sub dh,1
mov al,160
mul dh
mov di,ax ;行偏移
sub dl,1
mov al,2
mul dl ;列偏移
add di,ax ;行偏移+列偏移
;-------------------------------------
mov dh,cl ;将颜色cl赋予dh
s: mov cl,ds:[si] ;将字符传给cl
mov ch,0 ;在cx为0时跳出循环
mov dl,cl ;字符
mov es:[di],dx ;字符+颜色传递到显示位置
inc si ;调用下一个字符
add di,2 ;显示下一个字符
jcxz ok ;当cx为0时结束循环,字符最后一个为0
loop s
ok: pop dx
pop cx
ret ;返回到主函数
code ends
end start