DOS显示原理学习

assume cs:code
code segment
start: mov ah,0
int 16h
mov ah,1;这步什么作用呢???
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp short sret
red: shl ah,1;移位就能改变颜色吗??
green: shl ah,1;同上
blue : mov bx,0b800h;关于蓝色的设置怎么和前两个不一样呢??又是什么原理呢?
mov es,bx
mov bx,1
mov cx,2000
s: and byte ptr es:[bx],11111000b
or es:[bx],ah
add bx,2
loop s
sret: mov ax,4c00h
int 21h
code ends
end start
功能:按下r,屏幕字符颜色变为红色,按下g,屏幕字符颜色变为绿色,按下b,屏幕字符颜色变为蓝色。问题已在程序代码后标出,希望高人解释一下,越详细越好。
一位道友的回答:
这个解释起来就要涉及到显示缓冲区的问题了。
计算机机字符下共有80x25区域,共2000字符,每个字符占用2个字节,其中低字节为字符,高字节为字节的属性,共8位,每位都定义有显示属性,从高位到低位依次是 :闪烁   背景红   背景绿   背景蓝   高亮   前景红   前景绿   前景蓝,这也是11111000b后3位置0的用意。最后3位就是改变字符颜色的关键。
mov ah,1;这步什么作用呢???就是预设了颜色为蓝色, or es:[bx],ah,如果ah为1,结果就是把

11111000变成了11111001,就是蓝色。同理green: shl ah,1;同上,11111000变成了11111010
红色时,执行了2次shl ah, 1,则11111000变成了11111100,就是红色。
mov bx,0b800h;b800是显示缓冲区的首地址, mov bx,1则指向了第一个字符的高位字节。

and byte ptr es:[bx],11111000b
or es:[bx],ah
则改变了颜色,mov cx,2000则是说共修改了80*25个字符,就是计算机字符界面下的字符数量。
来源:http://zhidao.baidu.com/question/510679382.html?fr=im100400#submit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值