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 dx
push ax
push es
push bx
push cx ;保存寄存器数值
mov ax,0b800h
mov es,ax
mov bx,0 ;定义显存段
mov ax,0a0h
mul dh ;要求的行号,结果在ax中
add bx,ax
mov ax,2
mul dl ;将要求的列数乘以2,得到的结果在ax中
add bx,ax ;将要写入的横竖轴的偏移地址bx
xr: mov cl,[si] ;将数据段的字符带入cl
mov ch,0
jcxz ok ;cx为0跳转到标号ok处,不为0向下
pop cx ;将颜色值还原到cx中
push cx
mov al,[si]
mov es:[bx],al ;将数据段的字符带入显存段里面
mov es:[bx+1],cl ;将色彩值cl放到显存段字符的后面一个内存单元
inc si ;数据段偏移加1
add bx,2 ;显存段偏移加2
jmp short xr ;跳转到标号xr处
ok: pop cx
pop bx
pop es
pop ax
pop dx
ret ;将所有入栈的寄存器还原,返回到调用call的下面一句指令
code ends
end start |