←第 10 章・微處理器輸入輸出 全部課程
第 10 章 第 16–17 週

微處理器輸入輸出

Microprocessor I/O

期末的重點。前面 I/O 用的是輪詢(一直問),這章教中斷(讓裝置主動通知)。你在微算機實習 Lab3 做的就是這個。

課本小節
  • 輪詢 vs 中斷
  • 中斷服務常式
  • 副程式與堆疊
概念 01

輪詢 vs 中斷

Polling vs Interrupt
白話講

輪詢=你在等快遞,每 30 秒跑到門口看一次。什麼事都做不了,超浪費時間。

中斷=你裝了門鈴。你安心做自己的事,快遞到了會按鈴,你再去開門。

中斷讓 CPU 不用空轉,效率高非常多。代價是硬體和程式都變複雜。

中斷發生時 CPU 做的事:① 存現場(PC 和狀態)② 跳到 ISR ③ 執行 ④ 還原現場 ⑤ 回原處繼續
在說什麼ISR = Interrupt Service Routine(中斷服務常式)。「存現場」是關鍵——不存的話回來就接不下去了。

ISR 裡面用到的暫存器一定要先存、最後還原。因為中斷是隨機發生的,主程式不知道自己被打斷,如果 ISR 改壞了某個暫存器,主程式會莫名其妙出錯。這是實習 Lab3 最常見的 bug。

概念 02

副程式與堆疊

Subroutines and the Stack
白話講

呼叫副程式要記住「等一下回哪裡」。LC-3 用 JSR 呼叫,返回位址放在 R7,用 RET 回來。

但如果副程式裡又呼叫另一個副程式,R7 就被蓋掉了,回不去了。

解法:堆疊——像一疊盤子,後放的先拿(LIFO)。每呼叫一層就把返回位址推進去 (push),回來時拿出來 (pop)。層層巢狀也不會亂。

JSR LABEL → R7 ← PC,PC ← LABEL
RET    → PC ← R7
在說什麼巢狀呼叫前一定要先把 R7 推進堆疊,回來前再 pop 出來。不然第二層的 JSR 會把第一層的返回位址蓋掉。

呼叫者存 vs 被呼叫者存:誰負責保存暫存器要講清楚。LC-3 慣例是被呼叫者(callee)在開頭把自己會用到的暫存器存起來,結束前還原。作業題常考這個。

白話講堂・由 Atlas 產生。內容依據課程教材與官方教學大綱整理,不是老師的官方講義,請以課堂公告為準。