;在指定位置,指定顏色,顯示一個用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