实验环境
win10、dosbox、masm5.17
实验内容:显示字符串
显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。
要求
提供一个子程序在指定的位置,用指定的颜色,显示一个用0结束的字符串。
代码实现
assume cs:code,ds:data,ss:stack
data segment
db 'Hello World',0
data ends
stack segment
db 8 dup(0)
db 8 dup(0)
stack ends
code segment
start: mov dh,8 ;第八行
mov dl,3 ;第三列
mov cl,2 ;绿色
mov ax,data ;声明数据段
mov ds,ax
mov si,0
mov ax,stack ;声明栈段
mov ss,ax
mov sp,10h
call show_str
mov ax,4c00h
int 21h
show_str: push bx ;bx,cx,ax入栈
push cx
push ax
mov ax,0b800h ;显存地址段
mov es,ax
mov ax,0a0h ;先计算行偏移地址,以免在循环中重复执行
mul dh
mov bx,ax
show: mov al,2h ;先计算列偏移地址,空出ax寄存器
mul dl
mov di,ax
mov al,cl ;颜色暂存到al
xor cx,cx ;清零,否则jcxz永远不会退出
mov cl,[si] ;数据传送到cl寄存器,低位
jcxz ok ;比较cx的值,如果等于0,子程序返回
mov ch,al ;颜色放在高位
mov es:[bx][di],cx ;把数据传送到显存
mov cl,al ;还原颜色
inc si
inc dl
jmp short show
ok: pop ax ;ax,cx,bx弹栈
pop cx
pop bx
ret
code ends
end start