
如何用汇编语言实现有颜色字符串的显示?
2个回答
展开全部
直接写显存把,把ASCII写到显存里之后显卡就会帮你把字符显示出来了
比如在80×25,16色文本显示模式(默认的显示模式)下,往B800:0000写30H的话,在第一行第一列就会显示一个"0"
不过这种方法需要比较复杂的软件支持
你可以通过10号中断的03H子功能读取光标位置,然后计算显存地址,然后把AL中的ASCII MOV到显存里
80×25,16色文本显示模式的显存格式是:
ASCII(字节型数据)|前景及背景颜色(字节型数据,白字黑背景是07H)
两个字节为一个单位,表示一个字符,然后就是这样循环,来映射屏幕
==========================================================
对了,你是不是没有设置好字符的属性啊?
(9)、功能09H
功能描述:在当前光标处按指定属性显示字符
入口参数:AH=09H
AL=字符
BH=显示页码
BL=属性(文本模式)或颜色(图形模式)
CX=重复输出字符的次数
出口参数:无
要在BL里填07H才能显示白字黑背景的字呢
================================================
通过写显存的方式显示字符的例子,这个是在DOS下运行的,不过改一下的话估计就能在裸机上运行了,那个显示字符的子过程没保存用到的寄存器,注意一下
assume cs:code,ds:data
data segment
db 'Love WenDaoSheYu Forever!','#'
data ends
code segment
start:mov ax,000EH
int 10H
mov ax,0002H
int 10H
;-------全屏一下,不用按Alt+Enter了
mov ax,data
mov ds,ax
mov al,11001010B
xor bx,bx
mov dx,0604H
;-------"实参表"
call print
exit:mov ah,0
int 16H
mov ax,4C00H
int 21H
print:;(AL=字符属性 DS=待显示字符段地址)
;(BX=待显示字符偏移地址 DH=行 DL=列)
;80×25字符显示模式
;功能简介:显示以"#"结尾的一串字符
push ax
mov cx,0
mov cl,dh
dec cl
mov ax,cx
mov cl,160
mul cl
mov bp,ax
pop ax
;-------处理行信息
mov cl,dl
mov si,cx
dec si
shl si,1
;-------处理列信息
mov cx,0B800H
mov es,cx
;-------初始化显存段寄存器
mov ah,[bx]
mov cl,'#'
pris:mov es:[bp+si],ah
inc si
mov es:[bp+si],al
inc si
inc bx
mov ah,[bx]
cmp ah,cl
jnz pris
;-------显示字符串
ret
code ends
end start
比如在80×25,16色文本显示模式(默认的显示模式)下,往B800:0000写30H的话,在第一行第一列就会显示一个"0"
不过这种方法需要比较复杂的软件支持
你可以通过10号中断的03H子功能读取光标位置,然后计算显存地址,然后把AL中的ASCII MOV到显存里
80×25,16色文本显示模式的显存格式是:
ASCII(字节型数据)|前景及背景颜色(字节型数据,白字黑背景是07H)
两个字节为一个单位,表示一个字符,然后就是这样循环,来映射屏幕
==========================================================
对了,你是不是没有设置好字符的属性啊?
(9)、功能09H
功能描述:在当前光标处按指定属性显示字符
入口参数:AH=09H
AL=字符
BH=显示页码
BL=属性(文本模式)或颜色(图形模式)
CX=重复输出字符的次数
出口参数:无
要在BL里填07H才能显示白字黑背景的字呢
================================================
通过写显存的方式显示字符的例子,这个是在DOS下运行的,不过改一下的话估计就能在裸机上运行了,那个显示字符的子过程没保存用到的寄存器,注意一下
assume cs:code,ds:data
data segment
db 'Love WenDaoSheYu Forever!','#'
data ends
code segment
start:mov ax,000EH
int 10H
mov ax,0002H
int 10H
;-------全屏一下,不用按Alt+Enter了
mov ax,data
mov ds,ax
mov al,11001010B
xor bx,bx
mov dx,0604H
;-------"实参表"
call print
exit:mov ah,0
int 16H
mov ax,4C00H
int 21H
print:;(AL=字符属性 DS=待显示字符段地址)
;(BX=待显示字符偏移地址 DH=行 DL=列)
;80×25字符显示模式
;功能简介:显示以"#"结尾的一串字符
push ax
mov cx,0
mov cl,dh
dec cl
mov ax,cx
mov cl,160
mul cl
mov bp,ax
pop ax
;-------处理行信息
mov cl,dl
mov si,cx
dec si
shl si,1
;-------处理列信息
mov cx,0B800H
mov es,cx
;-------初始化显存段寄存器
mov ah,[bx]
mov cl,'#'
pris:mov es:[bp+si],ah
inc si
mov es:[bp+si],al
inc si
inc bx
mov ah,[bx]
cmp ah,cl
jnz pris
;-------显示字符串
ret
code ends
end start
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询