直接写屏


PC 机的硬件系统

Intel 公司设计出来了 8088 CPU,它有一套机器语言,虽然它的寄存器都是 16 位的,但是利用段和偏移的方法,它可以管理 1M 空间的存储器。

IBM 用它设计制造了(一系列的) PC 机。微软公司为 PC 机设计了操作系统 MSDOS、Windows。

IBM 设计硬件系统的时候,把一部份存储器空间,分配给了显示器、把一部份分配给了硬盘、一部份分配给了ROMBIOS、...。


显存

从 0B800H:0000H 开始,就是显示器的存储空间,这就是显存。

在 DOS 流行的时候,屏幕的显示,基本上都是文本模式。

在文本模式下,屏幕上共有 25 行、80 列,可显示 2000 个字符。

当对 0B800H:0000H 开始的内存空间写入数据的时候,字符将立即在屏幕上显示出来,这就是直接写屏。

要在屏幕上显示一个字符,需要连续写入两个字节,第一字节就是字符的 ASCII 码,第二字节是显示属性字节。

那么,要想写入一满屏的字符,就需要连续写入 4000 字节。这个数字就是“显存”的大小。

 

显示属性字节

属性字节的格式如下:

   +---+---+---+---+---+---+---+---+
   |  F | R | G |  B |  I |  R | G | B |
   +---+---+---+---+---+---+---+---+

其中高四位是控制背景颜色(8种)和字符闪烁,低四位控制字符的显示颜色(16种)。

低四位所控制的颜色如下所示:

    I   R   G   B    颜色

    0   0   0   0     黑
    0   0   0   1     蓝
    0   0   1   0     绿
    0   0   1   1     青
    0   1   0   0     红
    0   1   0   1    品红
    0   1   1   0     棕
    0   1   1   1     灰

    1   0   0   0    深灰
    1   0   0   1    浅蓝
    1   0   1   0    浅绿
    1   0   1   1    浅青
    1   1   0   0    浅红
    1   1   0   1    粉红
    1   1   1   0     黄
    1   1   1   1     白

背景色,原来说是仅有上面列出的前8种,F是控制字符闪烁的。但是,F的功能,在目前的XP系统中,发挥不出来了,那么它也能就使背景色显示出来16种。


一个直接写屏的程序

做而论道回答了一个关于直接写屏的问题,并获得了最佳。

题目链接:http://zhidao.baidu.com/question/370792173.html

最佳答案:

assume cs:codesg,ds:datasg
;------------------------
datasg segment      ;定义字符和属性
    DB  'w', 06H    ;黑色背景、棕色文字
    DB  'e', 02H    ;黑色背景、绿色文字
    DB  'l', 07H    ;黑色背景、灰色文字
    DB  'c', 26H    ;绿色背景、棕色文字
    DB  'o', 85H    ;深灰色背景、品红色文字
    DB  'm', 74H    ;灰色背景、红色文字
    DB  'e', 98H

datasg ends
;------------------------
codesg segment
start:
    MOV  AX,  datasg
    MOV  DS,  AX

    mov  bx, 0b800h
    mov  es, bx

    mov  bx, 0
    mov  cx, 6    ;设定循环次数
s:
    mov  ax, [BX]      ;取来字符和属性
    mov  es:[BX], ax   ;直接写屏

    add  BX, 2         ;每次写两个字节,显示一个字符

    loop s             ;循环6次
   
    mov ax, 4c00h      ;退出
    int 21h
codesg ends
    end start
;------------------------
程序运行后,显示如下图:

 直接写屏 - 非著名博主 - 电子信息角落


显示位置的控制

在前面的程序中已经看到,对 0B800H:0000H 开始的空间连续写入数据的时候,字符是在屏幕的左上角连续显示出来的。

如果连续写入 160 字节后,第一行(80个字符)就显示满了,再接着写入的字符,将显示在屏幕的第二行。

那么,在 12 * 160 + 36 * 2 = 12 * (80 * 2)  + 36 * 2 字节的位置写入,就将在第 12 行第 36 列上显示。

其它位置可以自行推算。

常见的微机原理教材中,有这方面的简介。

不过,这知识,太老了,没有必要深入研究,早就没有用了。呵呵
==========================================================

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值