;在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
;(cl)=颜色,ds:si指向字符串的首地址
;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串
assume cs:code, ds:data
data segment
db 'Welcome to masm!', 0
data ends
code segment
start:
mov dh, 8 ;(dh)=行号(取值范围0~24)
mov dl, 3 ;(dl)=列号(取值范围0~79)
mov cl, 2 ;(cl)=颜色
mov ax, data
mov ds, ax
mov si, 0
call show_str
mov ax, 4c00H
int 21H
show_str:
push cx
push si
mov al, 0A0H ;每行有80*2==160个字节==0A0H个字节
dec dh ;行号在显存中从0开始,所以减1
mul dh ;相当于从第(n-1)*0A0H个Byte单元开始
mov bx, ax ;定位好的位置偏移地址存放在bx里(行)
mov al, 2 ;每个字符占两个字节
mul dl ;定位列,结果ax存放的是定位好的列的位置
sub ax, 2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
add bx, ax ;此时bx中存放的是行与列号的偏移地址
mov ax, 0B800H ;显存开始的地址
mov es, ax ;es中存放的是显存的第0页(共0--7页)的起始的段地址
mov di, 0 ;di指向显存的偏移地址,确定指向下一个要处理的字符的位置
mov al, cl ;cl是存放颜色的参数,这时候al存放颜色了
mov ch, 0 ;下边cx存放的是每次准备处理的字符
s: mov cl, ds:[si] ;ds:[si]指向“Welcome to masm", 0
jcxz ok ;当cl的值为0的时候,cx == 0,则发生跳转,到ok处结束处理
mov es:[bx+di], cl ;偶地址存放字符
mov es:[bx+di+1], al ;奇地址存放字符的颜色属性
inc si ;指向下个字符
add di, 2 ;指向下个字符
jmp short s ;无条件跳转,jcxz是离开的关键跳转
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】
code ends
end start
在指定的位置,用指定的颜色,显示一个用0结束的字符串
最新推荐文章于 2022-05-02 10:28:51 发布