如何用汇编语言实现有颜色字符串的显示
如果我要汇编语言,在屏幕上显示一个固定字符串,分别为蓝色和绿色,应该如何实现?我是新手,请各位指教,分数不多,各位帮帮忙~!...
如果我要汇编语言,在屏幕上显示一个固定字符串,分别为蓝色和绿色,应该如何实现?
我是新手,请各位指教,分数不多,各位帮帮忙~! 展开
我是新手,请各位指教,分数不多,各位帮帮忙~! 展开
展开全部
直接写显存把,把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
展开全部
用汇编语言实现有颜色字符串的显示,,可以调用BIOS中断INT 10h设置颜色,输出显示可以调用DOS功能INT 21H。程序示例如下:
data segment
Total db 'Made in China$'
data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
mov ah,0bh
mov bx,000ah;设定颜色为绿色
int 10h
mov dx,offset Total
mov ah,09h;显示字符串
int 21h
mov ah,4ch
int 21h
ret
main endp
data segment
Total db 'Made in China$'
data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
mov ah,0bh
mov bx,000ah;设定颜色为绿色
int 10h
mov dx,offset Total
mov ah,09h;显示字符串
int 21h
mov ah,4ch
int 21h
ret
main endp
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
MOV AH,02H ;设置光标位置 的中断
MOV BH,M ;BH表示页
MOV DH,X ; X表示行
MOV DL,Y ;Y表示列
INT 10H
MOV AH,09H;在当前光标位置显示字符,不改变光标位置
MOV AL,‘***’ ;‘***’表示你要显示的固定字符串
MOV BH,0H
MOV BL,Z ;Z表示颜色。
MOV CX,1 ;CX表示重复次数
INT 10H
蓝色,Z=01H或者19H
绿色,Z=02 或者2AH 这两个之间是有没有背景色的区别。
MOV BH,M ;BH表示页
MOV DH,X ; X表示行
MOV DL,Y ;Y表示列
INT 10H
MOV AH,09H;在当前光标位置显示字符,不改变光标位置
MOV AL,‘***’ ;‘***’表示你要显示的固定字符串
MOV BH,0H
MOV BL,Z ;Z表示颜色。
MOV CX,1 ;CX表示重复次数
INT 10H
蓝色,Z=01H或者19H
绿色,Z=02 或者2AH 这两个之间是有没有背景色的区别。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询