⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page153.html

📁 李春生的汇编书籍
💻 HTML
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第6章 文字输出与键盘输入</title>
</head>

<body>
<style type="text/css">
body {
	background-color: #c0c0c0;
}

table {
	background-color: #c0c0c0;
	line-height: 24px;
}
</style>
<!导航条>
<p><a href="content1.html">目录</a> <a href="page152.html">上一页</a> <a href="page154.html">下一页</a> <a href="page168.html">下一章</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!标尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td> <!左侧空白>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td> <!右侧空白>
</tr>

<!页眉行>
<tr height=60 valign="bottom">
<td></td><td></td><td></td>
<td colspan=6><img src="icons/flag.gif"></td><td colspan=4></td><td colspan=6 align="right">第6章 文字输出与键盘输入</td> <!章节名>
<td></td><td>-153-</td><td></td> <!页码>
</tr>
<!页眉线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋体" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!顶部空白>

<tr>
<td></td><td></td> <!左边距>
<td colspan=2><hr><td colspan=4 align="center"><font face="楷体_GB2312" size=4>MOV DX,端口号</font></td><td colspan=12><hr></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=8><hr></td><td colspan=8 align="center"><font face="楷体_GB2312" size=4>IN 累加器,DX;(或OUT DX,累加器)</font></td><td colspan=2><hr></td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  当然,区别还是有的:首先,我们只能使用DX寄存器做间接寻址;其次,访问端口无需采用"[DX]"的形式。在后面给出的程序例中你可以看到这种方法的具体应用。<br>
  知道如何访问端口,这只是一个开始,我们第二步需要了解的就是显示卡上的端口寄存器的结构。显示卡上的寄存器数量很多,如果给每个寄存器都分配一个端口号那将耗用很多的端口地址资源。而且给设计程序带来不便。所以几乎所有的显示卡都采用了"寄存器堆"的结构。<br>
  所谓寄存器堆,其实就是将一些功能相关的寄存器组成一组,分配一个端口号,所有寄存器都从这一个端口输入输出。大家可能会联想起我们在前面讲解定时器时曾经说过,给定时器设定"N"值时要把16位的数据分成两次从同一端口"42H"送进定时器。注意这和现在要讲的知识并不一样。这是因为既然"一堆"寄存器只有一个端口传输数据,那么我们要访问其中一个寄存器就必须有办法"指定"要访问的对象。所以一个寄存器堆实际分配了两个端口,第一个用于指定要访问的寄存器,第二个用于传输数据。<br>
  习惯上通常将第一个端口称为"索引"端口,将第二个端口称为"数据"端口。一般情况下索引端口地址与数据端口地址是相临的,如显示卡上有一个被称为CRTC(CRT Controler)的寄存器堆,专门用于控制送到显示器的各种信号,系统分配给这个寄存器堆的两个端口地址是3D4H和3D5H,其中3D4H是"索引"端口,3D5H是"数据"端口。如果程序要访问CRTC的第10个寄存器,那么首先要向端口3D4H送出寄存器号10,此时CRTC的第10个寄存器就和端口3D5H相连通,这时候再用"IN"或"OUT"对端口3D5H进行操作,就可以取得CRTC10号寄存器的数据或将数据送入CRTC10号寄存器中。相应的程序如下:
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=5>
MOV  DX,3D4H<br>
MOV  AL,10<br>
OUT  DX,AL<br>
MOV  DX,3D5H<br>
IN   AL,DX
</td>
<td colspan=13>
;准备访问"索引"端口3D4H<br>
;选择CRTC10号寄存器<br>
;输出寄存器号<br>
;准备访问"数据"端口3D5H<br>
;读取CRTC10号寄存器的值
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  了解了显示卡上的寄存器结构,第三步就是要详细了解寄存器堆中每个成员的作用了。表6-2列出了CGA卡上CRTC寄存器堆中所有寄存器的功能,共有18个寄存器:<br>
  下面对这些寄存器作一些详细的说明:<br>
<font face="楷体_GB2312">
  (1)CRTC0-CRTC3称为水平寄存器,用来控制显示器水平方向的显示特性,比如每行字符数,每个字符的宽度等。<br>
  (2)CRTC4-CRTC9称为垂直寄存器,用来控制显示器垂直方向的显示特性,比如全屏显示的字符行数,每个字符占据的扫描线数等。<br>
  (3)CRTC16-CRTC17,这两个寄存器用来控制光笔。<br>
  (4)CRTC10-CRTC15,这六个寄存器是我们重点要讨论的,通过这六个寄存器,我们可以详细了解BIOS功能调用的执行情况。
</font>
</td>
<td></td><td></td> <!右边距>
</tr>

</font>

<!页脚线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!页脚>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright &copy; 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!导航条>
<p align="right"><a href="content1.html">目录</a> <a href="page152.html">上一页</a> <a href="page154.html">下一页</a> <a href="page168.html">下一章</a></p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -