汇编-彩色字符模式显示缓冲区结构

 

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

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

2.在80×25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色、前景色、闪烁、高亮等组合信息)。

3.这样,一个字符在显示缓冲区中就要占两个字节,分别存放字符的ASCII码和属性。80×25模式下,一屏的内容在显示缓冲区中共占4000个字节。

4000字节=FA0H

4.显示缓冲区分为8页,每页4KB(4096B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上。

5.在一页显示缓冲区中:

偏移 000~09F 对应显示器上的第1行(80个字符占160个字节=A0);

偏移 0A0~13F 对应显示器上的第2行;

偏移 140~1DF 对应显示器上的第3行;

偏移 1E0~27F 对应显示器上的第4行;

偏移 280~31F 对应显示器上的第5行;

偏移 320~3BF 对应显示器上的第6行;

偏移 3A0~43F 对应显示器上的第7行;

偏移 440~4DF 对应显示器上的第8行;

偏移 4E0~57F 对应显示器上的第9行;

偏移 580~61F 对应显示器上的第10行;

偏移 620~6BF 对应显示器上的第11行;

偏移 6A0~73F 对应显示器上的第12行;

偏移 740~7DF 对应显示器上的第13行;

偏移 7E0~87F 对应显示器上的第14行;

偏移 880~91F 对应显示器上的第15行;

偏移 920~9BF 对应显示器上的第16行;

偏移 9A0~A3F 对应显示器上的第17行;

 

依此类推,可知,偏移 F0O~F9F 对应显示器上的第25行

6.在一行中

一个字符占两个字节的存储空间(一个字),低位字节存储字符的ASCII码,高位字节存储字符的属性。一行共有80个字符,占160个字节。

在显示缓冲区中,偶地址存放字符,奇地址存放字符的颜色属性。

即在一行中:
00~01单元对应显示器上的第1列;

02~03单元对应显示器上的第2列;

04~05单元对应显示器上的第3列;

依此类推,可知,9E~9F单元对应显示器上的第80列。

7.颜色

一个在屏幕上显示的字符,具有前景(字符色)和背景(底色)两种颜色,字符还可以以高亮度和闪烁的方式显示。前景色、背景色、闪烁、高亮等信息被记录在属性字节中。

属性字节的格式:

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

注意,闪烁的效果必须在全屏DOS方式下才能看到。

 

 

实例

复制代码
;目的;在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm’

assume cs:code,ds:data

data segment;数据段
db 'welcome to masm!'
db 2h,24h,71h          ;绿色、绿底红色、白底蓝色
data ends 

stack segment   ;栈段
    dw 8 dup(0)
stack ends


  
 code segment 
 start:
        mov ax, data
        mov ds,ax
        
        mov ax,stack
        mov ss,ax
        mov sp,10h
        
        xor bx,bx  ;异或:bx清零,用来索引颜色
        
        mov ax,0B872h  ;第12行中间字符位置作为段地址
        mov cx,3   ;循环次数3行
        
     s3:push cx  ;外循环值压入栈,防止内循环中被破坏
        push ax  ;
        push bx
        mov es,ax  ;es起始位置
        
        mov si,0  ;索引字符
        mov di,0  ;定位目标位置
        mov cx,10h  ;内循环,字符总数
        
     s1:mov al,ds:[si]
        mov es:[di],al
        inc si
        add di,2
        loop s1    ;此循环复制字符
        
        mov di,1
        pop bx
        mov al,ds:[bx+10h]  ;取颜色
        inc bx
        mov cx,10h
        
     s2:mov es:[di],al
        add di,2
        loop s2     ;此循环放颜色
        
        pop ax
        add ax,0ah  ;段地址0ah实际就是0a0h=160
        pop cx
        loop s3
                
        
        mov ax,4c00h
        int 21h
        
      
 code ends 
 end start
 
 
 
复制代码

 

 

 

行列位置关系

i表示行    j表示列   n表示偏移量

n=i*160+j*2

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-08-01 pyqt5-动画组QAnimationGroup
点击右上角即可分享
微信分享提示

目录导航