1、显示字符串
问题
显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能、我们应该提供最灵活的调用接口
,使调用者可以决定显示的位置(行和列)、内容和颜色
子程序描述
名称:show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0-79),
(cl)=颜色,ds:si指向字符串的首地址
返回:无
应用举例:在屏幕的8行3列,用绿色显示data段中的字符串
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: :
:
:
code ends
end start
完整代码如下:
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
push bx
push cx
push dx
push es
push si
push di
mov ax, 0B800h
mov es, ax
;初始化显示字符首地址
mov al, 160;每行占80个字符,共160个字节
mov bl, dh
dec bl
mul bl
mov bx, ax
;偏移量,三列 即从第三个字符(第六个字节)开始显示
mov al, 2
dec dl
mul dl
add bx, ax
mov di, 0
mov al, cl
call change
change: mov cl, [si]
mov ch, 0
jcxz ok
mov ch, al
mov es:[bx + di], cx
inc si
add di, 2
jmp short change
;出栈顺序与进栈顺序相反
ok: pop di
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
运行截图: