做了题目也总结一下,如下所示
程序如下所示
assume cs:code,ss:stack,ds:data
data segment
db 'Welcome to masm!',0
data ends
stack segment
db 48 dup (0)
stack ends
code segment
start:mov dh,8 ;代表第8行
mov dl,3 ;代表第3列
mov cl,2 ;设置cl为2就是绿色字符属性
mov ax,data ;设置数据段的地址
mov ds,ax
mov ax,stack ;设置栈段
mov ss,ax
mov sp,48 ;设置sp
mov si,0 ;设置si
call show_str ;调用show_str
mov ax,4c00h ;结束程序
int 21h
show_str:push cx
push dx
mov bx,0b800h ;设置为显存地址
mov es,bx ;移动到扩展段
mov al,160 ;160个字节一列
sub dh,1 ;第8行开始地址为160*7所以减1
mul dh ;乘7
mov di,ax ;设置di为ax
sub dl,1 ;dl减1就为第二列开始处
mov al,2 ;列中以2个字节为一组数据高地址是字符属性
mul dl ;让al乘dl,结果保存在ax中
add di,ax ;添加列的偏移地址
mov dh,cl ;存放字符的属性
s: mov cl,ds:[si] ;给字符数据给cl
mov ch,0 ;将ch设置为0
jcxz ok ;如果cx为0了,也就是遇到最后一个字符串了就跳出来了
mov dl,cl ;将字符数据给dl
mov es:[di],dx ;设置dx给显存地址区域,dx中包含了字符属性和字符数据
inc si ;字符数据往后偏移
add di,2 ;di加2就是到下一个显存地址处以两个字节为一轮
loop s ;循环
ok:pop dx ;dx寄存器出栈也就是保存的8行和3列数据出栈
pop cx ;cx出栈
ret
code ends
end start
执行结果