汇编语言(王爽) 实验10.1

发布时间 2023-07-04 17:23:49作者: hellomydaughter
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 ax                            ;show_str 改变了这些寄存器的值,所以要提前入栈,把寄存器的值保存起来
        push cx
        push es
        push si
        push di
        
        mov di,0                            ;根据dh和dl的值算出显存(起始B800H)的偏移地址di的值
        mov ah,0
        mov al,160
        mul dh
        add di,ax
        mov ah,0
        mov al,2
        mul dl
        add di,ax

        mov ax,0b800h                        ;es寄存器存储显存的起始地址(B800H)
        mov es,ax

        mov ah,cl                             ;因为后面会把data处的字符存储进cx,提前把字符属性cl存入ah
        mov ch,0
 change:mov cl,[si]                           ;把data处的字符存入cx,判断cx的值是否为0,不为0才进行接下去的操作,否则准备结束子程序
        jcxz ok
        mov al,[si]                            ;每次把data处的字符存入al
        mov es:[di],ax                         ;把al中的字符值和ah中的字符属性一并存入显存
        inc si
        add di,2
        jmp short change

     ok:pop di                               ;show_str 快结束前把压进栈的寄存器值取出来,注意先入栈的要后出栈
        pop si
        pop es
        pop cx
        pop ax
        ret

code ends
end start