基于之前实验9的基础,这里要求用调用子程序的形式,dh为行数,dl为列数,cl为颜色,ds:si指向字符串的首地址。功能要求:在屏幕的8行三列用绿色显示data中的字符串
代码如下
;在屏幕的8行3列,用绿色显示data段中的字符串
assume cs:code,ds:data,ss:stack
data segment
db 'Welcome to masm!',0
data ends
stack segment
db 100 dup('0')
stack ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov si,0
mov ax,0b800h
add dl,dl
sub dl,2
mov bx,0ah
sub dh,1
mov cl,dh
mov ch,0
s:add ax,bx
loop s
mov es,ax;es现在是第八行的段地址
mov cl,2
mov dh,0
mov di,dx
call show_str
mov ax,4c00h
int 21h
;show_str函数的作用就是将数据输入显存区,并存入绿色属性
show_str:
mov cx,16
s1:mov dx,cx
mov cl,[si]
mov ch,0
jcxz ok
mov al,[si]
mov es:[di],al
mov byte ptr es:1[di],02h
add di,2
inc si
mov cx,dx
loop s1
ok:ret
code ends
end start
执行结果如下
主要是参数属实有点烦,你不能直接算出来,要通过数据自行传递,这样才符合设计初衷,子程序的独立性较强,当然了这里可以改进一点,就是最后输入绿色02h的属性时,不用02h,直接用cl,cl经历一个出入栈过程即可。