;理解原理
;接收用户的键盘输入,输入“r”,将屏幕上的字符设置为红色:输入“g”,
;将屏幕上的字符设置为绿色;输入“b ”,将屏幕上的字符设置为蓝色。
;A、B、C处的程序指令比较有技巧,请读者自行分析
assume cs:code
code segment
start:
mov ah,0
int 16h ;int 16h 0号功能实现从键盘缓冲区读取一个键盘输入
mov ah,1 ;A
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp short sret
red:
shl ah,1 ;B
green:
shl ah,1 ;C
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 时,
指令会从标号 red 开始执行
执行完 shl ah,1
之后会接着从green标号开始执行
又是一句 shl ah,1
由于 ah = 0000 0001 H
经过两次 左移 变成 ah = 0000 0100 H
颜色属性按照
颜色 闪烁 R G B 高亮 R G B
ah = 0 0 0 0 0 1 0 0
从而完成前景色设置为 红色
在汇编语言中,屏幕通常是25行和80列。在80x25的彩色模式下,显示器可以显示25行,每行80个字符,总共可以显示2000个字符(mov cx, 2000 屏幕上所有字符)。
屏幕分辨率和显存地址
在文本模式下,屏幕的显示内容来自显存中的数据。具体来说,屏幕的显存起始地址为0B8000H,每个字符占据2个字节,其中低位存储字符的ASCII码,高位存储字符的属性(如颜色)。行号的取值范围是0到24,列号的取值范围是0到79。因此,第n行的首地址可以通过公式计算:行号 x 80 x 2
and byte ptr es:[bx],11111000b
or es:[bx],ah
这两句,bx=1 第一个字符,RGB 3位先被设为0其余位不变。or语句又把颜色设为ah(100),比如红色。循环2000次,每个字符都变成红色(r)。
1257

被折叠的 条评论
为什么被折叠?



