?? page153.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 © 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 + -