实验10,求思路,有点模糊
assume cs:code,ds:datadata segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8;dx=0800
mov dl,3 ;dx=0803
mov cl,2 ;cx=0002
mov ax,data ;data=0caf ax=data
mov ds,ax ;ds=0caf
mov si,0 ;si=0000
call show_str ;call 0016 ip=0016 sp=fffe
mov ax,4c00h
int 21h
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24);
; (dl)=列号(取值范围0~79);
; (cl)=颜色;
; ds:si指向字符串的首地址。
;返回:无。
show_str:
push ax ;0017sp=fffc
push bx ;0018 sp=fffa
push es ;0019sp=fff8
push si ;001asp=fff6
;----------------------------------------------------------
;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
mov ax,0b800h ;ax=b800
mov es,ax ;es=b800
mov ax,160 ;ax=00a0
mul dh ;ax=0500
mov bx,ax ;bx=160*dh
mov ax,2
mul dl ;ax=dl*2
add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
;
;------------------------------------------------------------
mov al,cl ;把颜色cl赋值al
mov cl,0
show0:
mov ch, ;cx=0000 变为cx=7700
jcxz show1 ;(ds:si)=0时,转到show1执行,等于0会是什么情况?
mov es:,ch
mov es:.1,al
inc si ;ds:si指向下一个字符地址
add bx,2 ;es:bx指向下一个显存地址
jmp show0
show1:
pop si
pop es
pop bx
pop ax
ret
code ends
end start
等于0会是什么情况?要打印的数据不是在ds段嘛,然后字符串又是以0为结尾的。等于0了,自然就是到了最后一个字节了,就是打印字符串结束了,这个子程序可以ret了,当然ret前要把push进去的pop出来。如果检测出来不为0,就执行
inc si ;ds:si指向下一个字符地址
add bx,2 ;es:bx指向下一个显存地址
准备打印下一个字符。直到检测到0
页:
[1]