目录 上一页 下一页 下一章

第6章 文字输出与键盘输入 -153-


MOV DX,端口号

IN 累加器,DX;(或OUT DX,累加器)
  当然,区别还是有的:首先,我们只能使用DX寄存器做间接寻址;其次,访问端口无需采用"[DX]"的形式。在后面给出的程序例中你可以看到这种方法的具体应用。
  知道如何访问端口,这只是一个开始,我们第二步需要了解的就是显示卡上的端口寄存器的结构。显示卡上的寄存器数量很多,如果给每个寄存器都分配一个端口号那将耗用很多的端口地址资源。而且给设计程序带来不便。所以几乎所有的显示卡都采用了"寄存器堆"的结构。
  所谓寄存器堆,其实就是将一些功能相关的寄存器组成一组,分配一个端口号,所有寄存器都从这一个端口输入输出。大家可能会联想起我们在前面讲解定时器时曾经说过,给定时器设定"N"值时要把16位的数据分成两次从同一端口"42H"送进定时器。注意这和现在要讲的知识并不一样。这是因为既然"一堆"寄存器只有一个端口传输数据,那么我们要访问其中一个寄存器就必须有办法"指定"要访问的对象。所以一个寄存器堆实际分配了两个端口,第一个用于指定要访问的寄存器,第二个用于传输数据。
  习惯上通常将第一个端口称为"索引"端口,将第二个端口称为"数据"端口。一般情况下索引端口地址与数据端口地址是相临的,如显示卡上有一个被称为CRTC(CRT Controler)的寄存器堆,专门用于控制送到显示器的各种信号,系统分配给这个寄存器堆的两个端口地址是3D4H和3D5H,其中3D4H是"索引"端口,3D5H是"数据"端口。如果程序要访问CRTC的第10个寄存器,那么首先要向端口3D4H送出寄存器号10,此时CRTC的第10个寄存器就和端口3D5H相连通,这时候再用"IN"或"OUT"对端口3D5H进行操作,就可以取得CRTC10号寄存器的数据或将数据送入CRTC10号寄存器中。相应的程序如下:
MOV DX,3D4H
MOV AL,10
OUT DX,AL
MOV DX,3D5H
IN AL,DX
;准备访问"索引"端口3D4H
;选择CRTC10号寄存器
;输出寄存器号
;准备访问"数据"端口3D5H
;读取CRTC10号寄存器的值
  了解了显示卡上的寄存器结构,第三步就是要详细了解寄存器堆中每个成员的作用了。表6-2列出了CGA卡上CRTC寄存器堆中所有寄存器的功能,共有18个寄存器:
  下面对这些寄存器作一些详细的说明:
  (1)CRTC0-CRTC3称为水平寄存器,用来控制显示器水平方向的显示特性,比如每行字符数,每个字符的宽度等。
  (2)CRTC4-CRTC9称为垂直寄存器,用来控制显示器垂直方向的显示特性,比如全屏显示的字符行数,每个字符占据的扫描线数等。
  (3)CRTC16-CRTC17,这两个寄存器用来控制光笔。
  (4)CRTC10-CRTC15,这六个寄存器是我们重点要讨论的,通过这六个寄存器,我们可以详细了解BIOS功能调用的执行情况。

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章