使用BIOS中断和汉字库显示汉字

本文介绍了如何使用BIOS中断和汉字库在DOS环境下显示汉字,包括点阵、字模的概念,以及如何利用INT 10H的0CH功能在图形模式下画点。通过示例程序展示了从字模库读取数据并在屏幕上显示汉字的过程,解释了汉字编码、内码与区位码的关系,以及内码如何转换为字模库中的偏移量。
摘要由CSDN通过智能技术生成

计算机中的字符与图形本是一回事。显示器上出现的字符也是由点组成的,这一点我们在第六章已有讲述。比如说字母A,它在屏幕上实际是如图9-2所示的一组点。


图9-2 "A"的构成

现在的问题就是这样一组点如何用数字表示。试想如果我们把不亮的点用0表示,把亮点用1表示,那么字母A最顶端的8个点就可以表示为"00010000",这实际上是一个8位二进制数。下面几行同样可以用几个8位二进制数表示,因此字母A可以用8个8位二进制数表示,共用8个字节。

在计算机内有很多地方使用这种方法描述文字与符号,我们所常见的汉字也有用此方法描述的。只不过由于汉字的宽度与高度都大于8个点,所以描述汉字要使用更多的字节。

我们常把描述一个字符(汉字)的一组点称为"点阵",而把"点阵"的"数字表示"称为"字模"(Font Mask)R,以刚才所举的字母A为例,组成字母A的64个点就是这个字母的点阵,而表示这个点阵的8个8位二进制数就是这个字母的字模。

由许多字模数据所组成的文件就是"字模库"。比如UCDOS汉字系统中的文件"HZK16"就是包含了6768个国标汉字字模的一个"库"。当然,描述字形的技术还有其它的,并不是仅此一种,但上述方法在处理时比较简单,十分适合描述较简单的字形。

有了上述这些基础知识,我们现在就可以来具体地研究BIOS提供的图形功能了。如前所述,"点"是构成复杂图形的基本单元,我们现在就来学习如何在屏幕指定位置画上一个点。10H中断提供的0CH功能可用于在图形模式下画点,这个功能的用法如下:
功能号:0CH


用 途:在图形屏幕上的指定位置画一个"点"(像素)
参 数:CX=指定位置的X坐标
        DX=指定位置的Y坐标
        AL=颜色值
        调用:INT 10H
返回:无


在应用这个功能之前大家先要清楚屏幕坐标是如何规定的。在第六章我们说到过在字符模式下屏幕坐标原点在左上角,X轴方向向右与习惯相同。而Y轴方向向下,正好与习惯相反。在图形模式下屏幕依旧如此,只不过坐标的划分更细了。下面这个程序可在屏幕上画出一个彩色的方块来:


code  segment
              assume    cs:code,ds:code
              org       100h
        main  proc      near
              jmp       short start ;跳过数据区
         l_u  dw        20,20 ;方块左上角的(X,Y)坐标
         r_d  dw        100,150 ;方块右下角的(X,Y)坐标
      start:
              mov       ax,0004h ;设置图形显示模式4
              int       10h

              mov       si,word ptr r_d ;右下角的X坐标送入SI寄存器
              sub       si,word ptr l_u ;减去左上角的X坐标,计算X方向上的点数
              mov       cx,word ptr l_u ;左上角X坐标送入CX寄存器
    b_loop1:
              mov       di,word ptr r_d+2 ;右下角的Y坐标送入DI寄存器
              sub       di,word ptr l_u+2 ;减去左上角的Y坐标,计算Y方向上的点数
              mov       dx,word ptr l_u+2 ;左上角的Y坐标送入DX寄存器
              mov       al,2 ;选择洋红色
    b_loop2:
              mov       ah,0ch ;利用10H中断的0CH功能画点
              int       10h

              inc       dx ;Y坐标加1,
              dec       di ;已画完Y方向上所有的点了吗?
              jnz       b_loop2 ;若没画完Y方向上全部点,转B_LOOP2继续

              inc       cx ;X坐标加1,准备画下一条竖线
              dec       si ;X方向上所有竖线都画完了吗?
              jnz       b_loop1 ;若未画完X方向上全部竖线,转B_LOOP1继续

              mov       ah,0 ;等待键盘输入
              int       16h

              mov       ax,0003h ;设置字符显示模式3
              int       10h

              int       20h ;结束进程
        main  endp
        code  ends
              end       main



STARMAP的程序,这个程序可以从UCDOS的字模库文件HZK16中读出一些数据,加以处理后在字符屏幕上显示出一幅由星号构成的图形。下面这个程序由STARMAP略做修改而成:
DOTMAP.ASM
        data  segment
              assume    ds:data
       fname  db        'hzk16',0 ;UCDOS汉字系统的显示字模库
      buffer  db        32 dup(0) ;文件缓冲区
         off  dw        1520h,0002h,3340h,0001h ;所需数据在字模库中的偏移位置
              dw        18e0h,0000h,74a0h,0002h, 2520h,0001h
         msg  db        Press any key to display the next font.',0dh,0ah,24h
        data  ends

        code  segment
              assume    cs:code
        code  segment
              assume    cs:code
        main  proc      far
              mov       ax,data ;初始化DS寄存器
              mov       ds,ax

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值