第 6 章
與微處理器溝通
期中範圍的最後一段。兩件事:怎麼做輸入輸出,和組譯器怎麼把你的程式碼翻成機器碼。
- TRAP 與服務常式
- 裝置暫存器
- 組合語言與組譯流程
- 符號表
概念 01
TRAP:跟作業系統借工具
白話講
你想在螢幕印一個字。你要自己去操作螢幕的硬體嗎?太麻煩、也太危險。
TRAP 就是「按服務鈴」:你說「我要 x21 號服務(印一個字)」,作業系統就幫你做完,再把控制權還你。
像在餐廳你不用進廚房,按鈴跟服務生講就好。
TRAP x20 GETC 讀一個鍵(不顯示)
TRAP x21 OUT 印一個字(放在 R0)
TRAP x22 PUTS 印一整串字
TRAP x23 IN 讀一個鍵(會顯示)
TRAP x25 HALT 停機
在說什麼trap vector(x20 ~ x25)是服務編號。CPU 去記憶體開頭的 trap vector table 查這個編號對應的程式在哪,跳過去做完再回來。
TRAP 會把返回位址存在 R7。所以呼叫 TRAP 之前,如果 R7 裡有你要的東西,要先存起來,不然會被蓋掉。副程式巢狀呼叫時這個問題更嚴重。
概念 02
裝置暫存器:鍵盤和螢幕長什麼樣
白話講
對 CPU 來說,鍵盤和螢幕就是記憶體裡的幾個特殊格子(記憶體映射 I/O)。
每個裝置有兩個格子:一個放「狀態」(準備好了沒)、一個放「資料」。
KBSR xFE00 鍵盤狀態(最高位 = 1 表示有人按鍵了)
KBDR xFE02 鍵盤資料(按了什麼字)
DSR xFE04 螢幕狀態(最高位 = 1 表示螢幕可以接收了)
DDR xFE06 螢幕資料(要印的字)
在說什麼標準流程叫 polling(輪詢):不斷去讀狀態暫存器,等到 ready bit 變 1,才去讀/寫資料暫存器。
一定要先檢查狀態再動資料。螢幕還沒準備好你就塞字,字會不見。這個「先等 ready」的迴圈是 I/O 程式的固定開頭。
概念 03
組譯流程:你的字怎麼變成 0 和 1
白話講
你寫 ADD R1, R2, R3,CPU 看不懂。組譯器把它翻成 16 個 0 和 1。
但有個雞生蛋的問題:你寫 BR LOOP 時,組譯器還不知道 LOOP 在第幾行(它還沒讀到)。
解法:讀兩遍。
第一遍 (Pass 1) 只做一件事:建立符號表(每個 label 在第幾個位址)
第二遍 (Pass 2) 照符號表,把每一行翻成機器碼
在說什麼為什麼要兩遍?因為有「向前引用」(用到還沒定義的 label)。第一遍先把所有 label 的位址記下來,第二遍就都查得到了。這是必考問答題。
虛擬指令(pseudo-op,不是真指令)
.ORIG x3000 程式從哪裡開始 .END 結束
.FILL 值 放一個值 .BLKW n 空出 n 格 .STRINGZ "…" 放字串
在說什麼這些是給組譯器看的指示,不會變成 CPU 執行的指令。.ORIG 和 .END 每個程式都要有。
考卷上會這樣寫
Explain why the assembler requires two passes. What is stored in the symbol table?
兩遍是為了處理向前引用(forward reference)。符號表存的是每個 label 對應的記憶體位址。Lecture10、11 講的就是這個。