第四章 MARIE: 簡易型電腦
了解本書所提供的簡易型架構, 以及此架構跟真正電腦的差別. 第四章 教學目的 學習現今電腦的一些基本組成元件. 能夠說明這些基本元件對程式執行的影響. 了解本書所提供的簡易型架構, 以及此架構跟真正電腦的差別. 知道程式如何起運作.
在第二章中, 我們討論了不同的電腦系統是如何儲存和處理資料的. 第三章描述了數位電路的基本元件. 4.1 簡介 第一章介紹了電腦系統的基本概念. 在第二章中, 我們討論了不同的電腦系統是如何儲存和處理資料的. 第三章描述了數位電路的基本元件. 有了這些基礎以後, 現在我們知道了電腦的元件是如何運行, 以及它們是如何配合來讓電腦系統為我們所用.
4.1 簡介 電腦的CPU會擷取, 解碼, 執行程式指令. CPU的二個主要部份為資料路徑(datapath)和 控制單元(control unit) datapath 是由算術邏輯單元(arithmetic-logic unit)和儲存單元(storage units (registers))所組成, 它們之間是由資料匯流排所連接, 同時也連接主記憶體. CPU中的元件透過控制單元的信號來產生對應的動作.
算術邏輯單元負責執行 (ALU) 控制單元指定的邏輯和算術運算. 控制單元根據程式計數暫存器和狀態暫存器來決定要發出怎麼樣的控制信號. 4.1 簡介 暫存器內的資料可供CPU存取. 暫存器可以用D 型正反器來製作. 32-bit的暫存器需要 32 個D型正反器. 算術邏輯單元負責執行 (ALU) 控制單元指定的邏輯和算術運算. 控制單元根據程式計數暫存器和狀態暫存器來決定要發出怎麼樣的控制信號.
4.1 簡介 CPU會藉由資料匯流排來和其它系統共享資料. 匯流排是一組導線, 每一導線同一時間可以傳輸一個bit. 通常電腦系統的匯流排有二種: 點對點 (point-to-point) 以及多點 (multipoint). 這是一個 point-to-point 匯流排組態:
控制線會在資料線從某裝置傳送資料到另一裝置時, 控制資料流的方向, 並且控制何時那個裝置能存取匯流排. 4.1 簡介 匯流排是由資料線, 控制線, 以及位址線. 控制線會在資料線從某裝置傳送資料到另一裝置時, 控制資料流的方向, 並且控制何時那個裝置能存取匯流排. 位址線會決定資料的來源或目的位置. 下張投影片會介紹匯流排組態的模型.
4.1 簡介
4.1 簡介 下面是一個多點匯流排. 因為多點匯流排是資源共享的方式, 所以要透過協定來控制存取的權力, 這是建置在硬體內的.
4.1 簡介 在主-從式組態中, 會有超過一個的匯流排主控者, 這時需要一個仲裁來決定那個裝置可以使用匯流排. 匯流排仲裁有四種主要的分類: 菊鏈(Daisy chain): 使用權是從高優先權傳到低優先權的裝置. 集中平行式(Centralized parallel): 每個裝置直接連接到仲裁電路. 自測分散式 (Distributed using self-detection): 裝置間自己決定誰可以拿到匯流排使用權. 碰撞偵測分散式(Distributed using collision-detection): 任何裝置都可提出使用需求. 如果資料發生碰撞, 就重新再試一次.
4.1 簡介 每一部電腦至少都有一個用來維持其元件之間同步的時脈. 每次資料搬移或計算都要固定的時脈週期數. 時脈頻率是以megahertz或gigahertz計算, 它決定了所有運算的速度快慢. 時脈週期時間是時脈頻率的倒數. 800 MHz 的時脈其時脈週期為 1.25 ns.
4.1 簡介 時脈速度和CPU的效能不能混為一談. 一個程式執行所需的CPU time 為: 我們會在後面的章節回過頭來探討這個問題.
4.1 簡介 電腦會透過輸出入(I/O)子系統和外界溝通. I/O 裝置會經由不同的介面和CPU連接. I/O 可以是記憶體映射(memory-mapped)– 就是說可以將I/O裝置視為主記憶體一樣. 或是可以將 I/O 視為指令導向方式(instruction-based), 那 CPU 就會有特殊的I/O 指令集. 我們會在第七章學習I/O的細節.
4.1 簡介 電腦的記憶體是由一個線性的可定址儲存空間所組成, 有點類似暫存器. 記憶體可以是byte-addressable, 或 word-addressable, 一個 word 通常由二或多個 bytes所組成. 記憶體是由RAM晶片所構成, 通常會說成length width. 如果某記憶體的word大小是 16 bits, 那一個 4M 16 的RAM晶片就有 4 百萬個16-bit 大小的記憶體空間.
4.1 簡介 電腦要如何存取某特定的記憶體空間呢? 我們可看出 4M 可以表示成 2 2 2 20 = 2 22 個字組. 記憶體的位置可以從0 編號到2 22 -1. 因此, 這個系統的記憶體匯流排至少要22條 address位址線. 位址線以二進制從0 “數到” 222 - 1. 每條線不是 “on” 就是 “off”, 這樣就可以指出所要的記憶體元素.
4.1 簡介 實體記憶體通常會使用超過一個RAM晶片. 當記憶體位址是以bank交錯在不同晶片上的方式來組織時, 存取會比較有效率 在low-order交錯方式中, 位址的low order bits 是用來選擇那個bank. 因此, 在high-order交錯方式中, 位址的high order bits 就是用來指出是那個bank. 下一張投影片會介紹這二種方法.
4.1 簡介 Low-Order 交錯 High-Order 交錯
當有一個高優先權的事件發生時, 一般程式的執行會被停止. CPU會透過中斷來轉移到某個事件. 4.1 簡介 當有一個高優先權的事件發生時, 一般程式的執行會被停止. CPU會透過中斷來轉移到某個事件. 中斷可以是I/O請求, 算術錯誤 (像是除0), 或是執行到一個未定義的指令. 每個中斷都有相對應的處理程序, 它會告訴CPU該如何處理所發生的中斷. 不可遮罩中斷有高優先權, 不可被忽略.
我們現在要用一個簡易型的電腦將之前討論的一些觀念作個整理. 4.2 MARIE 我們現在要用一個簡易型的電腦將之前討論的一些觀念作個整理. 這部電腦名為 the Machine Architecture that is Really Intuitive and Easy, MARIE的用途只是用來介紹電腦系統的基本概念. 雖然這個系統很簡單, 但是它有助於更深入的去了解一些更複雜的系統架構.
4.2 MARIE MARIE 架構有下列特性: 二進制, 2補數的資料表示. 內儲程式, 指令和資料字組長度固定. 4K words的word-addressable 主記憶體. 16-bit 資料字組. 16-bit 指令, 4 位元的 opcode 和 12 位元的位址 16-bit 算術邏輯單元 (ALU). 七個暫存器, 作為控制和資料的搬移.
4.2 MARIE MARIE的七個暫存器: 累加器, AC, 為一16-bit暫存器, 存有狀態運算子 (就是, “less than”小於) 或是有二個運算元指令中的一個運算元. 記憶體位址暫存器, MAR, 為一12-bit 暫存器, 存有指令或是運算元的記憶體位址. 記憶體緩衝暫存器, MBR, 為一16-bit暫存器 存著從記憶體或是要放到記憶體的資料.
4.2 MARIE MARIE的七個暫存器: 程式計數器, PC, 為一12-bit暫存器, 內有下一個要執行指令的位址. 指令暫存器, IR, 馬上要執行的指令. 輸入暫存器, InREG, 一個 8-bit 暫存器, 內有從輸入裝置讀入的資料. 輸出暫存器, OutREG, 一個 8-bit 暫存器, 裡面是準備要送到輸出裝置的資料.
4.2 MARIE MARIE 架構的方塊圖.
4.2 MARIE 暫存器是連接著的, 而且是經由通同的資料匯流排和主記憶體相連. 匯流排上的每個裝置都有唯一的識別號碼, 當裝置要進行某種動作時, 就會去設定控制線以取得匯流排的使用權. 累加器和記憶體緩衝暫存器之間, 還有ALU和累加器和記憶體緩衝暫存器之間都有獨立的連接. 這樣一來, 資料在這些裝置間搬移時就不需要用到主資料匯流排.
4.2 MARIE MARIE 的資料路徑方塊圖.
電腦的指令集架構 instruction set architecture (ISA) 苗述了指令的格式和機器所能執行的最基本動作. 4.2 MARIE 電腦的指令集架構 instruction set architecture (ISA) 苗述了指令的格式和機器所能執行的最基本動作. ISA 是電腦軟體和硬體之間的介面. 某些 ISA 含有好幾百種不同的只令. MARIE的ISA 只有13個指令.
4.2 MARIE 右邊為MARIE的指令 : 基本的 MARIE 指令有:
4.2 MARIE 這是LOAD 指令在IR的位元樣式: 我們可以看到opcode為1, 而且要載入資料的位址為 3.
4.2 MARIE 這是SKIPCOND 指令在IR的位元樣式: 我們可以看到 opcode為 8, 而 bits 11 and 10 是 10, 這表示如果AC內的值大於0的話, 那下一個指令就會跳過不做. 這個指令的十六進制表示為何?
4.2 MARIE 其實每個指令都是有一連串的小指令所構成, 這些小指令稱為微指令(microoperations). 指令所執行的微指令可以用暫存器轉移語言register transfer language (RTL)來表示. 在 MARIE的 RTL, 我們用M[X] 來表示資料存在記憶體X的位置, 而 表示將位元組資料搬到暫存器或是記憶體位置.
4.2 MARIE LOAD指令的RTL為: 同樣地, ADD指令的RTL 為: MAR X MBR M[MAR], AC MBR MAR X MBR M[MAR] AC AC + MBR
回想一下, SKIPCOND會根據AC的執來決定要不要跳過下一個指令. 這個指令的 RTL 是最複雜的: 4.2 MARIE 回想一下, SKIPCOND會根據AC的執來決定要不要跳過下一個指令. 這個指令的 RTL 是最複雜的: If IR[11 - 10] = 00 then If AC < 0 then PC PC + 1 else If IR[11 - 10] = 01 then If AC = 0 then PC PC + 1 else If IR[11 - 10] = 11 then If AC > 0 then PC PC + 1
4.3 指令的處理 擷取-解碼-執行 週期(fetch-decode-execute cycle)是電腦執行程式所進行的步驟. 我們一開始要從記憶體fetch一個instruction, 然後放到IR. 一放到IR, 這個指令馬上就會被decoded, 看下一步需要做什麼. 如果是要存取某個記憶體(運算元)的值, 就會被取出放到MBR. 都各就各位後, 指令就會被執行. 下一張投影片會介紹這個流程.
4.3 指令的處理
給定下列的MARIE 程式. 我們列出位址100 - 106 (hex)的助憶碼和二元樣式 : 4.4 一個簡單的程式範例 給定下列的MARIE 程式. 我們列出位址100 - 106 (hex)的助憶碼和二元樣式 :
4.4 一個簡單的程式範例 我們檢示一下當程式執行時電腦內部發生了什麼事. 這是一個 LOAD 104指令:
4.4 一個簡單的程式範例 第二個指令為 ADD 105:
助憶碼, 就像LOAD 104, 對人來說很容易寫也很容易了解. 但電腦是不可能了解這樣的指令. 4.5 組譯器的探討 助憶碼, 就像LOAD 104, 對人來說很容易寫也很容易了解. 但電腦是不可能了解這樣的指令. 組譯器(Assemblers) 將人類容易了解指令表示方式翻譯成電腦了解的機器語言. 我們要注意組譯器和編譯器的差別: 在組合語言來說, 助譯指令和機器碼之間有一對一的關係. 對編譯器來說則不一定.
4.5 組譯器的探討 組譯器會讀取助憶原始碼二次, 進而產生目的程式檔 (object program file). 在第一次讀取時, 組譯器會盡可能將程式組譯出來, 同時也產生一個符號表(symbol table), 它記載著程式中所有符號的記憶體參照位址. 在第二次讀取時, 就會利用符號表的值來完成所有的指令組譯.
4.5 組譯器的探討 試想我們的範例程式 (上面). 讀第一次時, 我們建出符號表, 及部份的指令. 注意到我們包含了HEX 和 DEC 來標明常數的基底為何. 讀第一次時, 我們建出符號表, 及部份的指令.
4.5 組譯器的探討 第二次讀完後, 就組譯完成了.
4.6 擴充我們的指令集 到目前為止, 我們所討論的 MARIE指令都是直接定址模式 ( direct addressing mode). 4.6 擴充我們的指令集 到目前為止, 我們所討論的 MARIE指令都是直接定址模式 ( direct addressing mode). 這表示運算元的位址都是直接寫在指令中的. 有時候間接定址法(indirect addressing) 會比較有用,間接定址法意思就是說運算元位址的位址. 如果你用過程式中的指標, 那你對間接位址就已經很熟悉了.
4.6 擴充我們的指令集 為了幫助你了解在機器層級發生了什麼事, 我們在MARIE 指令集中加入間接定址模式. ADDI 指令就是放了指向運算元位址的位址. 下面的RTL告訴我們在暫存器層級的意義: MAR X MBR M[MAR] MAR MBR AC AC + MBR
4.6 擴充我們的指令集 另一個有用的程式寫作工具就是subroutines. jump-and-store指令, JNS, 提供了某種程度的 subroutine 功能. JNS指令的細節就如下 RTL: MBR PC MAR X M[MAR] MBR MBR X AC 1 AC AC + MBR AC PC JNS 能夠遞迴嗎?
4.6 擴充我們的指令集 最後一個有用的指令是 CLEAR. 它只是將累加器清為. 這是 CLEAR的 RTL: 下一張投影片中, 我們用一個例子來包含這些新介紹的指令. AC 0
4.6 擴充我們的指令集 100 | LOAD Addr 101 | STORE Next 102 | LOAD Num 103 | SUBT One 104 | STORE Ctr 105 | CLEAR 106 |Loop LOAD Sum 107 | ADDI Next 108 | STORE Sum 109 | LOAD Next 10A | ADD One 10B | STORE Next 10C | LOAD Ctr 10D | SUBT One 10E | STORE Ctr 10F | SKIPCOND 000 110 | JUMP Loop 111 | HALT 112 |Addr HEX 118 113 |Next HEX 0 114 |Num DEC 5 115 |Sum DEC 0 116 |Ctr HEX 0 117 |One DEC 1 118 | DEC 10 119 | DEC 15 11A | DEC 2 11B | DEC 25 11C | DEC 30
4.7 解碼的探討 電腦的控制單元讓內部的運作保持同步, 確保資料流在正確的時間到達正確的元件. 控制單元有二種實作方式: 硬體接線式(hardwired) 和微程式(microprogrammed) 控制. 以微程式控制來說, 在微控制器中會有一個唯讀記憶體, 裡面有一個小型的程式. 硬體接線式則是用數位邏輯元件來組成這個程式.
4.7 解碼的探討 以硬體接線式來說, 我們的簡易型系統需要一個 4-to-14解碼器來解. 右邊的方塊圖就是硬體接線控制單元的一般組態.
4.7 解碼的探討 在微程式控制中, 控制是存在ROM, PROM或EPROM裡面.
4.8 實際的架構 MARIE 擁有很多現今架構的特睜, 但是它離實際的電腦還有一段距離. 後面的投影片我們要看二個實際的機器架構. 我們會介紹 Intel架構, 它是 CISC 的機器. 另一個是MIPS, 它是一個 RISC. CISC 是 complex instruction set computer的簡寫. RISC 代表 reduced instruction set computer. 我們會在第九章深入比較 “RISC” 和 “CISC”.
4.8 實際的架構 最經典的 Intel架構, 8086, 創於 1979年. 為 CISC 架構. IBM以此為CPU在1981年發表了著名的. 8086 有16-bit的 data 字組, 並支援 20-bit 記憶體位址. 沒多久, 出現了簡單的廉價版8-bit 8088. 它像 8086一樣也用20-bit 記憶體位址. 8086所能定址的最大記憶體空間為何?
4.8 實際的架構 8086 有四個 16-bit 通用暫存器, 這四個暫存器可以以半個字組的方式存取. 它也有一個旗標暫存器, 一個指令暫存器, 和一個透過基底指標和堆疊指標二個暫存器存取值的堆疊. 8086 內沒有浮點運算處理. 在1980年, Intel 發表了 8087 數值協同處理器, 因為價格的關係, 沒有多少人使用.
4.8 實際的架構 1985, Intel 發表 32-bit的 80386. 一樣沒有內建浮點運算單元. 80486發表於1989, 是在 80386加上 that had built-in浮點運算和 cache記憶體. 80386和80486 能和 8086 和 8088相容. 用較小字組系統寫的軟體就用32-bit暫存器的低位元部份.
4.8 實際的架構 目前來說, Intel最先進的 32-bit 微處理器就是Pentium 4. 其速度有 3.06 GHz. 這個時脈速度比8086快了超過 350 倍以上. 提昇速度的方法包括了多層次cache和指令管線化. Intel, 和許多其它CISC微處理器, 都使用了很多RISC 架構的觀念.
4.8 實際的架構 MIPS 家族的CPUs 曾是這類CPU中最成功的. 第一個MIPS CPU 在1986 發表. 它的字組大小為 32-bit, 可定址的記憶體空間為4GB. 過了幾年, MIPS 處理器被用在通用型電腦和遊戲機中 MIPS 架構現在有 32- 和 64-bit 版本.
4.8 實際的架構 MIPS 第一個 RISC微處理器之一. 最原始的 MIPS 架構有 55 個不同的指令, 8086 則超過了100個. MIPS 設計的初衷就是效能: 它是 load/store 架構, 表示只有 load 和 store指令可以存取記憶體. MIPS架構中大量的暫存器, 減少了匯流排的傳輸量. 這樣的設計是如何影響效能的?
結論 電腦系統的主要元件為 控制單元, 暫存器, 記憶體, ALU, 和資料路徑. 內部的時脈讓電腦內部所有事能保持同步. 控制單元可以是微程式或是. 硬體接線式的效能比較好, 而微程式可適性比較好, 容易改變.
結論 電腦透過不斷的fetch-decode-execute週期來執行程式. 電腦只能執行機器語言模式的程式. 組譯器將助譯碼翻譯成機器語言. Intel架構是CISC; MIPS 則是RISC architecture.
End of Chapter 3