80x25彩色字符模式

80x25彩色字符模式下显示缓冲区的结构:

  在内存地址空间中,B8000H~BFFFFH共32KB的空间,为80x25彩色字符模式的显示缓冲区。往这个地址空间中写入数据,写入的内容会立即出现在显示器上

  在80x25彩色字符模式下,显示器每行可以显示80个字符,可以显示25行。所以称为80x25,彩色字符模式是因每个字符可以有256种颜色属性(背景色,前景色,闪烁,高亮等)

 

 这样一个字符需要占用一个字节的数据+一个字节的颜色属性(256种即8位,即一个字节),低位字节存储字符的ASCII码,高位字节存储字符的颜色属性。

一个字符需要占2字节内存,一屏幕共80x25=2000个字符,占用4000字节, 所以B8000H~BFFFFH共32KB的空间共可以存放8页的彩色字符数据。

一般情况下显示第一页的字符数据,即B8000H~B8F9FH中的4000个字节存放的彩色字符将显示在屏幕上。

一行共80个彩色字符,即160个字节:

B8000H~B809FH 对应显示器第1行

B80A0H~B813FH 对应显示器第2行

B8140H~B81DFH 对应显示器第3行

。。。

B8F00H~B8F9FH 对应显示器第25行

 

一个彩色字符占2字节,一行80个彩色字符占160个字节即10H:

00~01 对应显示器上第1列

02~03 对应显示器上第2列

04~05 对应显示器上第3列

.。。。

9E~9F 对应显示器上第80列

 

颜色属性的格式

颜色属性占1个字节即8位:

      7  6  5  4  3  2  1  0

含义  BL       R      G       B       I        R       G      B

         闪烁     (456- 背景)        高亮       (012-前景)

 

R-红     G-绿   B-蓝

可以按位设置不同的属性字节,配出各种不同的前景色和背景色:

红底绿字   01000010B,16进制显示为42H

(第7位闪烁,不需要所以为0,第6位背景红色需要设为1,第5位不需要0.。。。。)

 

例: 在显示器0行0列显示红底高亮闪烁绿色的字符串’ABCDEF':

  ①按位设置颜色属性为: 11001010B,16进制显示为CAH

  ②ABCDEF对应的ASCII码分别为 41H,42H,43H,44H,45H,46H

       ③显示器的0行0列对应的内存地址为 B8000H,6个彩色字符占用12个字节,即应写在B8000~B800BH内存空间中

显示缓冲区中的内容为:

        00  01  02  03  04  05  06  07  08  09  0A  0B  ...

B800:0000      41  CA  42  CA  43  CA  44  CA  45  CA  46  CA  ...

 

(闪烁效果需要在全屏DOS方式下才能看到)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用汇编语言实现在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm’,并向`B8000H~BFFFFH`写入数据的代码: ``` assume cs:code data segment msg1 db 'welcome to masm', 0ah, 0dh, '$' msg2 db 'welcome to masm', 0ah, 0dh, '$' msg3 db 'welcome to masm', 0ah, 0dh, '$' data ends code segment start: mov ax, data mov ds, ax ; 获取屏幕宽度和高度 mov ah, 0fh int 10h mov bh, 0 mov bl, 7 mov cx, 80 div cx mov cx, ax mov dx, bx ; 计算字符串的长度 mov si, offset msg1 mov di, offset msg2 mov bp, offset msg3 mov al, 0 mov cx, 0 mov dl, byte ptr [si] cmp dl, '$' je calc_end calc_loop: inc si inc cx mov dl, byte ptr [si] cmp dl, '$' jne calc_loop calc_end: mov al, 0 mov dl, byte ptr [di] cmp dl, '$' je calc2_end calc2_loop: inc di add al, 2 mov dl, byte ptr [di] cmp dl, '$' jne calc2_loop calc2_end: mov al, 0 mov dl, byte ptr [bp] cmp dl, '$' je calc3_end calc3_loop: inc bp add al, 2 mov dl, byte ptr [bp] cmp dl, '$' jne calc3_loop calc3_end: ; 显示绿色字符串 mov ah, 0ah mov al, 7 mov bh, 0 mov cx, dx sub cx, byte ptr [si] shr cx, 1 mov dx, byte ptr [si] mov bp, sp add bp, 2 mov byte ptr [bp], dl inc bp mov byte ptr [bp], al inc bp mov si, offset msg1 mov ah, 0 rep movsb ; 显示绿底红色字符串 mov ah, 0ah mov al, 4 mov bh, 0 mov cx, dx sub cx, byte ptr [di] shr cx, 1 mov dx, byte ptr [di] mov bp, sp add bp, 2 mov byte ptr [bp], dl inc bp mov byte ptr [bp], al inc bp mov si, offset msg2 mov ah, 0 rep movsb ; 显示白底蓝色字符串 mov ah, 0ah mov al, 1 mov bh, 0 mov cx, dx sub cx, byte ptr [bp] shr cx, 1 mov dx, byte ptr [bp] mov bp, sp add bp, 2 mov byte ptr [bp], dl inc bp mov byte ptr [bp], al inc bp mov si, offset msg3 mov ah, 0 rep movsb ; 向B8000H~BFFFFH写入数据 mov bx, 0b800h mov es, bx xor bx, bx lea si, [msg1] mov cx, dx mov dl, byte ptr [si] cmp dl, '$' je write_end write_loop: inc si mov al, byte ptr [si] mov ah, byte ptr [si+1] shl ah, 4 or al, ah mov es:[bx], ax add bx, 2 mov dl, byte ptr [si] cmp dl, '$' jne write_loop write_end: ; 退出程序 mov ah, 4ch int 21h code ends end start ``` 解释一下代码: 首先,我们使用`assume cs:code`语句来声明代码段的名称为`code`。 然后,在`data segment`中,我们定义了三个字符串`msg1`、`msg2`和`msg3`,分别用于显示绿色、绿底红色和白底蓝色的字符串。每个字符串后面都加上了换行和回车符号,并以`$`作为结束符号。 接着,在`code segment`中,我们定义了一个`start`标签,表示程序的入口点。 然后,我们使用`mov ax, data`和`mov ds, ax`语句将数据段的地址加载到`DS`寄存器中,以便我们可以访问定义的字符串。 接下来,我们使用`int 10h`中断调用来获取屏幕的宽度和高度,并保存在`CX`和`DX`寄存器中。然后,我们计算出每个字符串在屏幕上的起始位置和长度。 然后,我们分别使用`mov ah, 0ah`和`int 10h`中断调用来显示三个字符串。其中,`mov al, 7`、`mov al, 4`和`mov al, 1`分别表示要显示的字符串的颜色。 接下来,我们使用`mov bx, 0b800h`和`mov es, bx`语句将`ES`寄存器加载到显存地址`0b800h`,以便我们可以向显存中写入数据。然后,我们使用`rep movsb`指令向显存中写入数据,从而在屏幕上显示字符串。 最后,我们使用`mov ah, 4ch`和`int 21h`来退出程序。 注意:上面的代码是在`DOS`环境下编写和运行的。如果你使用的是`Windows`或其他操作系统,需要使用相应的系统调用来向显存中写入数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值