文本模式下图形字符的显示


概述:
    在文本显示模式下,常常可以见到一些字符集里没有的字符,如几个汉字,一个电话符号,还有如 Norton 的 NDD,SPEEDISK 内的窗口边框等等。这些字符是用改变系统的显示字符集的办法实现的。具体来说,就是将一些暂时不用的字符的显示点阵换成自己定义的点阵,然后在显示这些字符时,屏幕上出来的就是自己定义的图像。当然,原来的字符将无法显示,所以,被替换的字符往往是一些不常用的制表符等字符。被替换掉的字符集将一直使用到下次用 INT 10H 的 AH=00H 功能重新设置显示模式时。

有关资料:

1.BIOS 中断 10H 的 11H         入口参数: AH = 11H

功能号 入口参数 出口参数
AL=00H或10H
装用户规定的字模
ES:BP=指定的字符点阵
CX=装入的字符数目
DX=从哪个字符开始装入
BL=要装入的模式
BH=每个字符点阵的数据字节数

汇编编程示例:

;定义字符点阵,下面是一个电话的符号,因为用一个字符的位置显示一个电话是不够的,所以下面是两个字符点阵的数据,要注意前16字节是电话的左半边,后16字节是电话的右半边,你把下面的数据化成二进制一看便知,不过就这32字节可花了我半小时在纸上画框框,打叉叉...
;比如以下的数据是这样得到的

;   ........       0000 0000      00h
;   ..
xxxxxx      0011 1111      3fh
;   .
x......       0100 0000      40h
;   .
x.xxxxx      0101 1111       5fh
;   .
x.x..x.      0101 0010       52h
;   .
xxx.x..      0111 0100       74h
;   ....
x.xx      0000 1011       0bh
;   ...
x.x..      0001 0100       14h
;   ..
x.x..x      0010 1001      29h
;   .
x..x.x.      0100 1010       4ah
;   .
x..x..x      0100 1001      49h
;   .
x...x..      0100 0100       44h
;   .
x....xx      0100 0011       43h
;   ..
xxxxxx       0011 1111      3fh
;   ........      0000 0000       00h
;   ........      0000 0000       00h

CHAR    db     00h,3fh,40h,5fh,52h,74h,0bh,14h         ;left part of phone
        db     29h,4ah,49h,44h,43h,3fh,00h,00h

        db     00h,0f8h,04h,0f4h,094h,5ch,0a0h,50h    ;right part of phone
        db     28h,0a4h,24h,44h,84h,0f8h,00h,00h

STR     db    'This is a phone:',0ceh,0cfh,'$'

        ...

        mov    ax,1100h             ;功能号
        mov    bx,1000h             ;BH=10H,每字符点阵为16字节
        mov    cx,2                 ;共要装入2字节
        mov    dx,00ceh             ;从00CEH开始(00CEH,00CFH)
        mov    es,data_segment
        mov    bp,offset char       ;ES:BP为字符点阵数据地址
        int    10h

        mov    ah,9                 ;把字符 ce,cf显示出来看看,是什么!
        mov    dx,offset str
        int    21h





(C) Copyright by LuoYunBin's Win32 ASM Page,http://asm.yeah.net