4. 處理器基礎:電腦的大腦
哈囉,未來的電腦科學家們!這一章至關重要,因為我們要深入探索電腦的「大腦」:中央處理單元 (CPU)。理解 CPU 的運作方式是電腦科學的基石。我們將探討其內部架構、指令的執行方式,以及如何透過最基礎的程式語言:組合語言 (Assembly Language) 與它溝通。
別擔心「暫存器 (registers)」或「匯流排 (buses)」這些名詞聽起來像是複雜的機械裝置——我們會用簡單且生活化的比喻來拆解它們。讀完這一章,你就能完全掌握電腦是如何處理你給它的每一道指令!
4.1 中央處理單元 (CPU) 架構
馮·紐曼架構與儲存程式概念
幾乎所有現代電腦都基於馮·紐曼架構 (Von Neumann Architecture)。這個由約翰·馮·紐曼提出的概念,定義了電腦系統的結構。
其核心理念是儲存程式概念 (Stored Program Concept):
- 程式指令與程式所使用的數據都存放在同一個記憶體單元(主記憶體或 RAM)中。
- 這使得 CPU 可以透過相同的路徑(匯流排)從記憶體中提取指令和數據。
比喻:想像一位廚師(CPU),他將食譜(指令)和食材(數據)都存放在同一個儲藏室(記憶體)裡。無論是要拿取下一步驟還是下一個食材,他前往儲藏室的路線都是一樣的。
CPU 與系統的關鍵組件
CPU 及其周邊環境由幾個關鍵的互動組件組成:
- 算術邏輯單元 (ALU):這是 CPU 的「計算機」。它執行所有算術運算(如加、減、乘、除)和邏輯運算(如 AND、OR、NOT、比較)。
- 控制單元 (CU):這是「經理」或「交通警察」。它協調 CPU 的所有活動,並指揮 CPU 與其他裝置之間的數據流向。它負責解碼指令並產生控制訊號。
- 即時存取記憶體 (IAS):這是電腦主記憶體 (RAM) 的另一個名稱。它保存著處理器目前正在使用的指令和數據。
- 系統時脈 (System Clock):產生定時訊號(脈衝),以同步 CPU 的所有運作。時脈速度決定了 CPU 每秒能執行多少個週期。
暫存器 (CPU 的隨手筆記本)
暫存器 (Registers) 是 CPU 內部極小且極快的記憶體位置,用來存放 CPU 當下立即需要處理的暫時性數據。
暫存器分為兩類:
- 通用暫存器 (General Purpose Registers):在算術或邏輯運算期間用於暫存數據(在本課程中,我們通常只考慮累加器作為通用暫存器)。
- 特殊用途暫存器 (Special Purpose Registers):每個在「擷取-執行」週期 (Fetch-Execute cycle) 中都有明確且固定的角色。
以下是你必須掌握的關鍵特殊用途暫存器:
- 程式計數器 (PC):保存下一個要被提取指令的記憶體位址。(它就像是指向下一個步驟的指標。)
- 記憶體位址暫存器 (MAR):保存目前正在被讀取或被寫入的記憶體位址。
- 記憶體數據暫存器 (MDR):保存剛剛從記憶體提取,或即將寫入記憶體的數據或指令。
- 累加器 (ACC):保存 ALU 運算後的中間結果。
- 現行指令暫存器 (CIR):保存目前正在被解碼和執行的指令。
- 索引暫存器 (IX):用於索引定址以修改位址,通常在處理清單或陣列時使用。
- 狀態暫存器 (Status Register):包含位元(旗標),指示 CPU 的當前狀態,例如是否發生溢位,或是上一次運算結果是否為零。
記憶口訣:MAR 是為了 Address(位址),MDR 是為了 Data(數據)。它們合作存取記憶體。
快速複習:暫存器的角色
如果你需要知道在記憶體中「去哪裡」,請使用 MAR。如果你需要持有剛剛拿到的「東西」,請使用 MDR 或 ACC。
系統匯流排 (數據高速公路)
匯流排是一組連接電腦系統組件、允許數據傳輸的平行線路。主要有三種類型:
- 位址匯流排 (Address Bus):承載正在存取的記憶體位置或周邊裝置的位址。
- 方向:單向(CPU 輸出位址)。
- 影響:其寬度(線路數量)決定了系統能定址的最大記憶體容量。
- 數據匯流排 (Data Bus):在組件之間傳輸數據或指令。
- 方向:雙向(數據雙向流動)。
- 影響:其寬度決定了同時可以傳輸多少位元。(匯流排越寬,數據傳輸越快)。
- 控制匯流排 (Control Bus):承載管理數據流向與定時的控制訊號(如讀取、寫入、時脈同步)。
- 方向:單向與雙向(雙向傳輸訊號)。
比喻:想像一個火車系統。位址匯流排是鐵軌(單向,決定地點)。數據匯流排是火車車廂(運載貨物)。控制匯流排是調度中心,負責指揮哪列火車去哪裡。
擷取-執行週期 (Fetch-Execute Cycle)
這是 CPU 執行程式指令的不間斷過程。它包含三個主要階段:擷取 (Fetch)、解碼 (Decode) 和執行 (Execute)。
週期步驟(使用暫存器傳輸記號 - RTN)
1. 擷取階段:從記憶體獲取下一個指令。
- MAR ← [PC]:下一個指令的位址從程式計數器 (PC) 複製到記憶體位址暫存器 (MAR)。
- PC ← [PC] + 1:PC 加 1,指向下一個指令(為下一個週期做準備)。
- MDR ← [MAR]:存儲在 MAR 所指位址的指令從記憶體中提取,並載入到記憶體數據暫存器 (MDR)。
- CIR ← [MDR]:指令從 MDR 複製到現行指令暫存器 (CIR)。
2. 解碼階段:控制單元 (CU) 解讀 CIR 中的指令。
- CU 判斷該指令的意義(例如:ADD、JUMP、LOAD)。
- 它為執行準備所需的任何數據,可能還會從記憶體中擷取運算元。
3. 執行階段:執行該指令。
- 如果是算術或邏輯指令,ALU 執行運算(例如將數值加到 ACC 中)。
- 如果是跳轉 (jump/branch) 指令,PC 可能會更新為新的位址。
- 控制訊號會發送給其他組件。
關鍵總結:擷取-執行週期是一個無止盡的迴圈。它每秒運行數百萬次,負責移動位址、提取指令並執行計算。
影響 CPU 效能的因素
電腦系統的速度和效率受多種硬體因素影響:
- 處理器類型與核心數量:更多的核心允許 CPU 同時運行多個 F-E 週期(平行處理)。
- 時脈速度:以十億赫茲 (GHz) 為單位。較高的時脈速度意味著每秒能執行更多的擷取-執行週期。
- 匯流排寬度:較寬的數據匯流排允許同時傳輸更多位元(例如,64 位元匯流排比 32 位元傳輸數據更快)。
- 快取記憶體 (Cache):位於 CPU 晶片上或附近、極快速的小型記憶體 (SRAM)。它儲存了經常使用的指令和數據,與存取主 RAM 相比,大幅加速了存取過程。快取越多,效能通常越好。
周邊連接 (連接埠)
不同的連接埠用於將周邊裝置連接到電腦:
- 通用序列匯流排 (USB):用於連接各種周邊裝置(鍵盤、滑鼠、隨身碟)的通用標準。它使用序列數據傳輸。
- 高畫質多媒體介面 (HDMI):主要用於傳輸高品質數位影音訊號(例如將電腦連接到螢幕或電視)。
- 影像圖形陣列 (VGA):一種較舊的標準,用於連接類比螢幕。它只傳輸視訊訊號,不傳輸音訊。
中斷 (處理緊急事件)
中斷 (Interrupt) 是由裝置或軟體發送給 CPU 的訊號,促使它暫停目前的任務以處理緊急事件。
- 目的:確保時間關鍵型事件(如按鍵動作或磁碟讀取完成)能被快速處理,防止 CPU 浪費時間不斷檢查(輪詢)裝置。
- 可能原因:硬體故障(如電源中斷)、I/O 完成(印表機完成工作)、計時器逾時,或非法指令(除以零)。
- 偵測:CPU 在每個擷取-執行週期的末尾檢查中斷。
- 處理過程:
- CPU 偵測到中斷訊號。
- 所有暫存器的內容(特別是 PC)被儲存到一個特殊位置(堆疊/Stack),以便 CPU 稍後能返回之前的任務。
- PC 被載入對應的中斷服務常式 (ISR) 的起始位址。
- 執行 ISR(處理緊急請求的程式)。
- ISR 完成後,從堆疊中恢復原始的暫存器內容,CPU 從中斷處恢復之前的任務。
馮·紐曼架構定義了儲存程式概念。CPU 使用特殊暫存器(PC、MAR、MDR、CIR、ACC)運行 F-E 週期。匯流排傳輸數據與位址,而中斷允許 CPU 高效管理緊急的外部請求。
4.2 組合語言
組合語言與機器碼的關係
機器碼 (Machine Code) 是程式設計的最底層——它是 CPU 直接執行的原始二進位指令(0 與 1)。對人類而言,閱讀或編寫起來既繁瑣又幾乎不可能。
組合語言 (Assembly Language) 是一種低階語言,使用助記符(如 ADD、JMP、LDM 等簡短易記的縮寫)來代表機器碼指令。
- 關鍵關係:組合語言與機器碼之間存在一對一的關係。一個組合語言指令直接翻譯成一個機器碼指令。
- 組譯器 (Assembler):一種稱為組譯器的軟體,負責將組合語言程式翻譯成可執行的機器碼。
兩趟組譯器 (Two-Pass Assembler)
由於組合語言程式經常使用標籤 (labels)(位址的符號名稱,如 LOOP 或 START),組譯器需要兩趟掃描才能完整翻譯程式碼。
第一趟:建立符號表 (Symbol Table)
- 組譯器逐行讀取原始碼。
- 它識別程式中使用的所有標籤。
- 它計算每個標籤定義的記憶體位址。
- 它建立一個符號表,映射每個標籤及其對應的位址。
- *關鍵在於,此階段尚未產生機器碼。*
第二趟:翻譯
- 組譯器第二次讀取原始碼。
- 它將每個助記指令翻譯成對應的二進位機器碼。
- 當遇到作為運算元的標籤(例如 JMP START)時,它會從符號表(第一趟建立的)中查出該標籤的實際記憶體位址,並將該位址插入機器碼指令中。
- 生成最終的可執行機器碼程式。
為什麼需要兩趟?如果程式前半段的指令(第一趟)引用了程式後半段定義的標籤(第二趟),組譯器必須依靠符號表來獲取該位址。
指令分組
組合語言指令通常按其功能分組:
- 數據傳輸:在暫存器和記憶體之間移動數據(如 LDM、STO、MOV)。
- 輸入與輸出 (I/O):處理 CPU 與周邊裝置之間的數據傳輸(如 IN、OUT)。
- 算術運算:數學計算(如 ADD、SUB、INC、DEC)。
- 無條件跳轉:總是改變執行流程的指令(如 JMP)。
- 條件跳轉:僅在狀態暫存器滿足特定條件時才改變流程,通常跟在比較 (COMPARE) 指令之後(如 JPE - Jump if True, JPN - Jump if False)。
- 比較指令:用於根據比較結果設定狀態暫存器中的旗標(如 CMP – 比較 ACC 的內容)。
定址模式 (Modes of Addressing)
定址模式定義了指令中的運算元部分如何參照所需的數據。這對於編寫高效的組合語言程式至關重要。
我們使用課程大綱提供的指令集表格作為參考。
- 立即定址 (Immediate Addressing, Opcode #n):
- 運算元本身即為要使用的數據。
- 範例:
LDM #10(將數字 10 載入累加器)。 - 優點:最快的模式,因為不需要存取記憶體。
- 直接定址 (Direct Addressing, Opcode <address>):
- 運算元是數據所存放的記憶體位址。
- 範例:
LDD 500(將記憶體位置 500 的內容載入 ACC)。 - 優點:存取固定記憶體位置的簡單方法。
- 間接定址 (Indirect Addressing, Opcode I <address>):
- 運算元是一個位址,該位址存放著另一個位址。CPU 先從第一個位置取得位址,再用該第二個位址去抓取實際數據。
- 範例:
LDI 500(到位置 500。讀取那裡找到的位址,假設是 800。然後將位置 800 的內容載入 ACC)。 - 優點:對於指標或需要動態改變資料指向時非常有用。
- 索引定址 (Indexed Addressing, Opcode X <address>):
- 有效位址是透過將運算元中的位址加上索引暫存器 (IX) 的內容計算得出。
- 範例:
LDX 500(有效位址 = 500 + [IX])。 - 優點:只需增加索引暫存器,即可依序存取陣列或清單中的元素。
- 相對定址 (Relative Addressing):
- 主要用於跳轉指令。跳轉到的位址相對於程式計數器 (PC) 的當前值。
- 優點:允許跳轉指令具有可重定位性(如果程式在記憶體中移動,跳轉仍相對於指令正確運作)。
組合語言使用助記符來代表機器碼。兩趟組譯器透過先建立符號表然後進行翻譯來處理標籤。定址模式定義了指令如何找到數據,從立即定址(數據在指令中)到索引定址(數據位址經由計算得出)。
4.3 位元操作 (Bit Manipulation)
位元操作是指使用邏輯運算或位移來改變暫存器或記憶體中個別位元。這是低階程式設計中設定旗標、縮放數值和控制裝置的基礎。
二進位位移 (Binary Shifts)
二進位位移會將暫存器(如 ACC)中的所有位元向左或向右移動指定數量 (n) 的位置。
1. 邏輯位移 (LSL 與 LSR)
- 邏輯左移 (LSL #n):位元向左移動 'n' 位。右端補 0。
- 效果:將數值乘以 \(2^n\)。
- 邏輯右移 (LSR #n):位元向右移動 'n' 位。左端補 0。
- 效果:將數值除以 \(2^n\)。
2. 算術位移 (Arithmetic Shifts)
這些位移專為帶正負號(二補數)的數字設計。
- 算術左移:與邏輯左移相同。
- 算術右移:位元向右移動,但保留最左邊的位元(符號位元/Sign Bit)以維持數字的正負號。如果數字為負(符號位為 1),則左邊不會補 0,而是填入符號位元。
常見錯誤:邏輯位移「只」應應用於無號數,因為它們不會保留符號位元。
3. 循環位移 (Cyclic/Rotational Shifts)
從一端移出的位元會插入到另一端。不會丟失任何位元,也不會補 0。
範例:如果 10110010 循環左移 1 位,會變成 01100101。
用於監控與控制的位元操作 (位元遮罩)
位元操作,通常稱為位元遮罩 (Bit Masking),用於直接與硬體控制暫存器互動。透過將「遮罩」(特定的二進位模式)與邏輯運算子 (AND, OR, XOR) 結合,我們可以隔離、設定或清除特定的位元。
1. 設定位元 (使用 OR)
要確保特定位元為 1 (SET),我們使用位元 OR 運算,配合僅在目標位置為 1 的遮罩。
OR 規則:X OR 1 = 1 且 X OR 0 = X
範例:要將 ACC (01010000) 的第 3 個位元(由右算起,位元位置 2)設為 1:
ACC: 0101 0000
MASK: 0000 0100
OR 結果: 0101 0100 (第 3 個位元現在確保為 1。)
2. 清除位元 (使用 AND)
要確保特定位元為 0 (CLEAR),我們使用位元 AND 運算,配合僅在目標位置為 0(其他皆為 1)的遮罩。
AND 規則:X AND 0 = 0 且 X AND 1 = X
範例:要清除 ACC (11011100) 的第 8 個位元(由右算起,位元位置 7):
ACC: 1101 1100
MASK: 0111 1111 (我們使用欲清除位元的反向遮罩)
AND 結果: 0101 1100 (第 8 個位元現在確保為 0。)
3. 測試/檢查位元 (使用 AND)
要查看某個位元目前是否已設定 (1),我們使用位元 AND 運算,配合僅在測試位置為 1 的遮罩。
如果結果為 0,則該位元為 0。如果結果不為 0,則該位元為 1。
範例:測試 ACC (10100000) 的第 5 個位元(位置 4):
ACC: 1010 0000
MASK: 0001 0000
AND 結果: 0000 0000 (第 5 個位元為 0。)
二進位位移可用於快速乘除。位元遮罩利用 AND 來清除位元,用 OR 來設定位元,並常用 AND 來測試硬體暫存器中特定位元的狀態。
恭喜!你現在已經掌握了處理器運作的核心原則。這些知識是你理解所有軟體如何與硬體互動的基石。請持續練習 F-E 週期步驟和定址模式——它們是考試中的核心考題!