王爽《汇编语言》第 3 版 实验 10 编写子程序 作业

warning: 这篇文章距离上次修改已过713天,其中的内容可能已经有所变动。
assume cs:code,ss:stack,ds:data

stack segment
    dw 0,0,0,0,0,0,0,0
stack ends

data segment
    db 'Welcome to masm!',0
data ends



code segment
    start:
        mov ax,stack
        mov ss,ax
        mov sp,16

        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:
        ;1 暂存子程序用到的寄存器
        push ax ;备份 ax
        push bx ;备份 bx
        push cx ;备份 cx
        push dx ;备份 dx
        push es    ;备份 es

        ;2 设置显存地址,段地址放入 es 中
        mov ax,0b800h
        mov es,ax ;设置显存段地址

        ;3 设置指定的行和列的显示偏移地址放入 bx 中
        push cx ;因为后面 loop 要用到 cx ,所以再备份一次
        mov ch,0
        mov cl,dh ;把参数行号放入 cx 中准备 loop
        mov bx,0 ;要把实际的行偏移地址放在 bx 中,所以清理 bx 准备放数据
        sub cx,1 ;cx-1 是因为要在第 8 行显示的话,地址加到第 7 行就行了
        setrows:
            add bx,160 ;这里加 160 是一行显示 80 个字符,每个字符占用 1 个字
            loop setrows    
        mov ch,0
        mov cl,dl
        sub cx,1
        setcols:
            add bx,2
            loop setcols
        pop cx
        mov dh,cl
        mov ch,0

        ;3 读取 data 中的字符
        readdata:
            mov cl,ds:[si]
            jcxz return_show_str    
            mov dl,cl
            mov es:[bx],dx
            inc si
            add bx,2
            jmp short readdata

        ;返回
        return_show_str:
            pop es
            pop dx
            pop cx
            pop bx
            pop ax
            ret



code ends

end start

none
最后修改于:2024年06月23日 11:20

添加新评论