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