汇编语⾔显⽰功能实现教程详解
⽬录
问题1
1 如何确定字符要显⽰的位置
确定3⾏字符在每⼀⾏的起始位置
确定3⾏字符在屏幕中的哪⼀⾏
2 如何确定字符要显⽰的颜⾊属性
问题2:
分析:
问题1
在屏幕中间分别显⽰绿底,绿底红⾊,⽩底蓝⾊的字符串“Welcome to masm!”
分析:
1 如何确定字符要显⽰的位置
在80*25的彩⾊字符模式显⽰缓冲区在内存地址的B8000H~BFFFFH共32KB的空间中
在该模式下,显⽰器可以显⽰25⾏,80列
所以在⼀⾏中就有80个字符,共占据160个字节,每个字符低位字节存储字符的ASCII码,⾼位字节存储字符的颜⾊属性偏移0000~009F对应的就是显⽰器上的第⼀⾏;
偏移0A00~13F0对应的就是显⽰器上的第⼆⾏;......依次类推
确定3⾏字符在每⼀⾏的起始位置
因为显⽰的在屏幕的中间,共需要32个字节,屏幕中⼀⾏共160个字节,所以开始字节为(160 - 32)/ 2 = 64
确定3⾏字符在屏幕中的哪⼀⾏
因为屏幕中⼀共25⾏,要显⽰3⾏字符串,⼀⾏有160个字符串,则第⼀⾏的开始位置是(25 - 3)/ 2 *
160 = 6E0H
第⼆⾏的开始位置是6E0H + 160 = 780H
第三⾏的开始位置是780H + 160 = 820H
2 如何确定字符要显⽰的颜⾊属性
每个字符的颜⾊属性占据⼀个字节,每⼀位表⽰的不同的颜⾊属性,则共有256种颜⾊属性
属性字节的格式:
7 (6 5 4) 3 (2 1 0)
BL (R G B) I (R G B)
闪烁背景⾼亮前景
绿底⿊⾊:0 010 0 000B (20H)
绿底红⾊:0 010 0 100B (42H)
⽩底蓝⾊:0 111 0 001B (71H)
assume cs:code,ds:data
data segment
db 'Welcome to masm!'
data ends
start: mov ax,data
mov ds,ax
mov bx,0 ;ds:bx指向数据段起始位置
mov ax,0B800H
mov es,ax ;设置显⽰内存空间的起始位置
mov si,64 ;设置字符串在⼀⾏中的中间位置
mov cx,16 ;设置循环的次数为字符串的长度
s: mov al,ds:[bx]
mov ah,20H ;设置第⼀⾏的开始位置和颜⾊
mov es:[si+6E0H],ax
mov ah,42h ;设置第⼆⾏的开始位置和颜⾊
mov es:[si+780H],ax
mov ah,71h ;设置第三⾏的开始位置和颜⾊
mov es:[si+820H],ax
inc bx ;设置字符串的偏移
add si,2 ;设置下⼀次循环的写⼊位置
loop s
mov ax,4c00h
int 21h
code ends
end start
问题2:
设计⼀个⼦程序,使调⽤者决定显⽰的位置,内容和颜⾊
分析:
要实现的功能:在指定的位置,⽤指定的颜⾊,显⽰⼀个⽤0结束的字符串
指定的参数:⾏号-dh(取值范围0~24),列号-dl(取值范围0~79),取值范围主要是根据显⽰器屏幕的⼤⼩颜⾊-cl,ds:si指向字符串的⾸地址
assume cs:code,ds:data
汇编语言结束指令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 ;ds:si指向数据段⾸地址
call show_str
mov ax,4c00h
int 21h
show_str: mov ax,0B800H
mov es,ax ;es指向显⽰内存空间的段地址
mov ax,160
dec dh
mul dh
mov dh,0
dec dl
add dl,dl
add ax,dx
mov di,ax ;设置di指向字符串要显⽰的偏移地址
mov ah,cl
show: mov cx,ds:[si]
jcxz ok ;设置在遇到字符0的时候退出
mov al,ds:[si]
add di,2
inc si
loop show
ok: retf
code ends
end start
以上就是汇编语⾔显⽰功能实现问题实例详解的详细内容,更多关于汇编语⾔显⽰功能的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论