?? page152.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="page151.html">上一頁</a> <a href="page153.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>-152-</td><td></td> <!頁碼>
<td colspan=6>PC機匯編語言實戰精解</td><td colspan=4></td><td colspan=6 align="right"><img src="icons/flag.gif"></td> <!書名>
<td></td><td></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=18>
13C6:0105 div bl<br>
13C6:0107 <br>
上面這個程序是一個根本不能正確運行的程序,原因在于除得的商太大,AL寄存器根本裝不下計算結果。這樣的現象稱為除法溢出,執行這個程序會產生意想不道的結果,可能是死機,也可能是其它什么結果。<br>
花這么多筆墨講解一條指令似乎有些不值當,但我的最終目的并非只為了講解這條指令,而是想告訴大家學習匯編指令的一種方法。從某種角度來說試圖通過讀書甚至背書來掌握這些指令并沒有多大效果,要想盡快學會匯編語言最佳的途徑就是多多實驗。我們有DEBUG這樣的好老師,它可以讓每條指令都活動起來,并且能告訴我們每條指令執行的結果。通過DEBUG我們可以動態地學習匯編指令,這比死記硬背的效果要好得多。這種研究問題的方法我們在前面已有所表現,希望大家能掌握這種方法并將其應用到自己的學習中去。<br>
上一章的最后曾經留下一個程序未做說明,學過這一節后我想那個程序已經沒有詳細分析的必要了。不知道大家是否對"直接寫屏"這個名詞有所耳聞,其實所謂"直接寫屏"指得就是程序將要顯示的數據直接送入顯示緩沖區中。<br>
到此為止我們已經學完了有關"Video RAM"的知識,其最重要內容無非是如何計算偏移量而已。至于如何讓程序的輸出效果更有吸引力,那就要看你的想象力有多豐富了。我可以幫你掌握已知,但開創未知恐怕就要看你自己的了。
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18><font face="黑體"><a name="64">6.4 端口編程</a></font></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
可移植性歷來是匯編語言所面臨的最為嚴重的問題之一,特別是編程控制顯示卡上的端口,這個問題更為突出。原因在于我們現在大量使用的VGA/Super VGA卡沒能做到在端口一級兼容早期的CGA卡。這不能不說是一種遺憾,要知道這些卡幾乎都做到了在顯示緩沖存儲器一級兼容CGA卡,只差一小步。因此,這一節將只準備討論那些適用于各種顯示卡的端口寄存器,給出的程序可以在大多數顯示卡上運行。首先我們要解決的第一個問題是DX寄存器在端口操作中的應用。<br>
我在前面曾經提到過DX寄存器在端口輸入與輸出中有特殊的用途,而且在討論發聲程序時也說到過指令"IN AL,??H"的形式只能在端口號小于0FFH時應用,但是顯示卡上的端口號都大于0FFH,如何才能訪問到這些端口呢?<br>
在給出具體的方法之前,我們還需復習一下有關尋址方式的知識。當我們從內存中取得數據時,我們可以采用直接尋址方式和寄存器間接尋址方式,以MOV指令為例,如果我們從DS:1234處讀取一字節數據到累加器,我們可以使用兩種方法編制程序:MOV AL,DS:[1234H]或MOV BX,1234H;MOV AL,[BX]。第一種方法就是直接尋址方式,第二種方法就是寄存器間接尋址方式。事實上,端口的訪問和內存訪問有很多相似的地方,象"IN AL,61H"這樣的用法其實就是對端口的直接尋址,那么端口的間接尋址又是什么情形呢?形式與訪問內存差不多:
</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="page151.html">上一頁</a> <a href="page153.html">下一頁</a> <a href="page168.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -