显示字符串的子函数

;-----------------------------------------------------------------------
; 显示字符串的子函数——

;-----------------------------------------------------------------------
assume cs:code,ds:data
data segment
        db 'Just Call Sub show_str!',0
data ends

code segment

start:

        mov dh,1              ;dh装行号(范围:1--25)
        mov dl,1              ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]
        mov cl,0ah            ;cl中存放颜色属性(0ah为绿色高亮)
        mov ax,data
        mov ds,ax
        mov si,0
       
        call show_str

        ;程序暂停,等待输入
        MOV AH,01H
        INT 21H

        mov ax,4c00h
        int 21h

       
;功能:显示字符串的子程序
;参数:(ds)字符串首地址 (si)欲显示字符串的开始 (dl)屏幕X坐标 (dh)屏幕Y坐标 (cl)颜色
;返回:无
show_str:  
        push cx
        push si
        push ax
        push dx
        push bx
        push es
        push di         ;子程序一共使用了七个寄存器
       
        mov al,0A0h
        dec dh          ;行号在显存中下标从0开始,所以减1
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
        add bx,ax      ;此时bx中存放的是行与列号的偏移地址
        mov ax,0B800h
        mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址
        mov di,0
        mov al,cl
        mov ch,0

s:      mov cl,ds:[si]
        jcxz ok
        mov es:[bx+di],cl       ;偶地址存放字符
        mov es:[bx+di+1],al     ;奇地址存放字符的颜色属性
        inc si
        add di,2
        jmp short s

ok:  

        pop di
        pop es
        pop bx
        pop dx
        pop ax
        pop si
        pop cx
        ret    ;显示字符串的子程序[定义结束]

code ends

end start

你可能感兴趣的:(字符串)