組合語言期末報告 小小鋼琴
此程式為實作一個小鋼琴,主要功能為:
1. 播放單易歌曲,有小星星、小蜜蜂、兩隻老虎、妹妹揹著洋娃娃、伊比呀呀、
火車快飛、Ten little Indians。
2. 自由彈奏,可像一般鋼琴一樣隨意練習。
以上功能皆可即時顯示目前發聲的音階。
內部運作原理:
1. 中斷、INT 的原理:
CPU 的暫存器中 CS 與 IP 會指到程式區上,由 IP 不斷地移動往下執行指令,
如果發生中斷的時候,CPU 則會執行完之前的工作,並停止接下來的工作,並 將 CS 與 IP 暫存器中的內容值傳入 stack 中暫時保存起來。中斷的種類有「硬體 中斷」、「軟體中斷」、「CPU 中斷」。每一種中斷服務都用一個編號來表示,這個 編號用來表示所要呼叫的中斷服務項目,80X86 利用內部 0000~003F 的區域來 當成各中斷的起始位址資料。譬如說第 n 號的中斷服程式的位址就存放於「中斷 向量表」中的第 4n 位元組上,當 CPU 執行到第 n 號中斷服務時,它便會在中斷 向量表的第 4n 位址上取得實際中斷服務的位址,並且到中斷服務的位址上執行 服務程式。而在組合語言中,最常用到的是軟體中斷要求,特別是第 21H 的中 斷服務,因為它可以用來做 DOS 的功能呼叫。
「CPU 執行中斷服務的流程」:CPU 執行工作→發生中斷→將 CS、IP 及 FLAG 的內容先保存在 stack 中→找出中斷服務的起始位址→執行中斷服務→從 stack 中取出 CS、IP 及 FLAG 的內容→CPU 繼續未完成的工作。
2. 喇叭發聲:
控制喇叭發聲的方法有兩種:一是經由計時器來推動,另一是直接控制。當 output port 61H 的 bit0=1 時,是計時器控制,此時當 bit1=1 時,喇叭是 ON,bit1=0 時喇叭 OFF。
開啟喇叭:
IN AL, 61H OR AL, 03H OUT 61H, AL
關掉喇叭:
IN AL, 61H AND AL, 0FCH OUT 61H, AL
3. 頻率控制:
建立表格來記錄每個音階對應的頻率。頻率來源根據參考書目,升降八度則 把頻率分別除或乘以 2 得到。例如:DO 的頻率為 1196h,升八度則除以 2 得到 8CBh,降八度則乘上 2 得到 232Ch。
本程式用 DI 去讀頻率表,把 DI 所指到的值放到 AX,再分別把 AL、AH 輸 出到 port 42H,但其為 8-bit,因此要分開輸出,即可控制頻率高低。
MOV AX, [ DI ] OUT 42H, AL MOV AL ,AH OUT 42H, AL
4. 如何讀取鍵盤資訊:
將 AH 設 07H,並執行 INT 21H,此功能會等待使用者按下任意鍵,將鍵盤 字元傳回至 AL 中,即可利用 AL 來判斷輸入的資訊。此中斷呼叫可用 Ctrl+C 來 中斷,但輸入的字元不會顯示在螢幕上。
MOV AH, 08H INT 21H
5. 歌曲部分:
每一個音由一個 WORD 表示,其表示方法如下:
1.前八個 bits:節拍 01>1/8 拍 02>半拍 04>一拍 08>二拍 2.第 9~12 個 bits:升降 0>降 8 7>不變 14>升 8
3.後面四個 bits:音高 1>DO 2>RE 3>ME 4>FA 5>SOL 6>LA 7>SI
另外每一首歌的開頭皆記錄了長度和適合此歌曲的節拍快慢。
6. 輸出部分:
將 AH 設 09H,DS:DX 存放字串起始位址,並執行 INT 21H,即可將字串 顯示在螢幕上,但此字串必須用’$’(ASCII 為 36d)作為結束。此外 10d 代表 New Line,13d 代表 Carriage Return。
MOV DX, OFFSET List1 MOV AH, 09H
INT 21H
參考書目:
1.「80X86 組合語言入門教材」,普悠瑪數位科技著,博碩文化出版 2.「PC XT/AT 組合語言 8088/8086 程式設計」, 蔡文能著,松崗出版 3.「80X86 與 MASM 6.x 組合語言精解–入門應用篇」,李永祥著,
第 3 波出版
4.「Assembly Language for Intel-Based Computers 4th edition」, Kip R. Irvine 著,Pearson Education 出版