;在指定位置,指定颜色,显示一个用0结束的字符串
;dh:行号(0-24),dl:列号(0-79),cl:颜色,ds:si指向字符串的首地址
assume cs:code,ds:data,ss:stack
data segment
db 'Welcome to masm! I am dty', 0
data ends
stack segment
db 20h dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,20h;初始化段
mov dh,5
mov dl,4
mov cl,2
mov si,0;参数放到寄存器
call show_str
mov ax,4c00h
int 21h
show_str:
push cx
push si
push dl;乘法可能会用到dx ,所以先保存到堆栈
mov ax, 0B800h;0B800h显存的基址
mov es, ax ; 设置显存段
xor ax,ax
mov al,dh
mov bx,160
mul bx
mov di,ax;行号*160 = 偏移
mov ax,0
pop dl
mov al,dl
mov bx,2
mul bx
add di,ax;行偏移加上列偏移
s:
mov al,ds:[si];
mov cl,[si]
mov ch,0
jcxz ok;取出字符串,放到al和cx里,jcxz判断CX是不是0,是0的话跳转到ok 结束
mov byte ptr es:[di],al;
mov bp,sp
mov bl,byte ptr ss:[bp+2];颜色信息在子程序开始的时候放到了堆栈里,这里取出颜色信息
mov byte ptr es:[di+1],bl;将颜色信息放到显存
add di,2
add si,1
jmp short s
ok:
pop si
pop cx;堆栈平衡
ret
code ends
end start