?? page57.html
字號:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第4章 奇妙的聲音</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="page56.html">上一頁</a> <a href="page58.html">下一頁</a> <a href="page80.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">第4章 奇妙的聲音</td> <!章節名>
<td></td><td>-57-</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>
小于+127,僅占一個字節,因此,編譯程序便自動地將另一個字節置成"90H",于是在可執行程序中就有了"NOP"指令。<br>
如果不想程序中出現"NOP"指令,那么就必須在源程序中明確指出"JMP"指令是"短程"跳轉,這只需將第一條指令改寫成"JMP SHORT START"即可,指令中的"SHORT"就是告訴編譯程序將此處的"JMP"指令處理為短程轉移。
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td>
<td colspan=18><FONT FACE="黑體" LANG="ZH-CN" SIZE=3><a name="42">4.2 精確定時</a></font></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
在<a href="page45.html#41">4.1節</a>中我們已經討論了如何通過定時器的通道3發出確定頻率的聲音,這一節我們要一起學習怎樣精確地定時,這樣才能解決演奏音樂的問題。<br>
PC中的定時電路有三個通道,通道3用于發聲,通道1用于控制系統內部的時鐘。大家都十分清楚用DOS的"TIME"命令可以觀察并修改系統內部的一個時鐘,這個時鐘之所以能連續運轉主要依靠定時器的通道1。<br>
通道1的工作方式和通道3一樣,但是系統啟動時設定其發出一個頻率固定為18.2Hz的信號,這個信號直接送到系統中的"中斷控制器"。每一個"Hz"都產生一個硬件中斷,一般稱這個硬中斷為"IRQ0",對應的中斷號是08H。也就是說,當計算機啟動后,我們的機器看上去十分平靜,但實際上CPU非常忙碌。在定時器的控制下每隔55毫秒就要執行一個08H號中斷,這個中斷的主要工作就是連續地計數。<br>
在內存"0040H:006CH"處有四字節的存儲空間專門用于保存計數值,CPU每執行一次08H中斷,這四字節的計數值就被加1,不難算出這個計數值每增加1091后時間恰好過了1分鐘,每增加65454后時間恰好過了1小時。系統內部的時鐘之所以能準確走時,靠得就是08H中斷和這四字節的計數值。因此我們要想精確的定時,必須依靠時鐘計數值才行。<br>
程序PROG9.ASM是一個能準確發出1000Hz聲音的程序,聲音持續時間為5秒鐘。這個程序中又出現了一條新的指令:
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3 align="center"><img src="icons/note.gif"></td>
<td colspan=15>
助記符:ADD(add)<br>
用 途:將兩個數據相加<br>
格 式:ADD 寄存器,立即數<br>
ADD 寄存器,存儲單元<br>
ADD 寄存器,寄存器<br>
ADD 存儲單元,立即數<br>
ADD 存儲單元,寄存器<br>
執 行:兩個數據相加,結果保存在左邊的寄存器或存儲單元中,右邊數據不變。
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td></td><td></td>
<td colspan=2>
PROG9.ASM<br>
PORT_B<br>
code<br>
<br><br>
main
<td colspan=2>
<br>
equ<br>
segment<br>
assume<br>
org<br>
proc
</td>
<td colspan=3>
<br>
61H<br>
<br>
cs:code,ds:code<br>
100h<br>
near
</td>
<td colspan=9>
</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="page56.html">上一頁</a> <a href="page58.html">下一頁</a> <a href="page80.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -