王爽《汇编语言》第 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