- 計算機系統(tǒng)解密:從理解計算機到編寫高效代碼
- (美)喬納森·E.斯坦哈特
- 2203字
- 2021-09-27 16:57:06
4.3 中央處理器
中央處理器(CPU)是計算機中進行實際計算的部分。按照我們的比喻,CPU住在市中心,城市里其他成員都是配角。CPU由許多不同的部分組成,我們將在本節(jié)介紹這些部分。
4.3.1 算術(shù)邏輯單元
算術(shù)邏輯單元(Arithmetic Logic Unit, ALU)是CPU的主要部件之一。它負責算術(shù)、布爾代數(shù)和其他運算。圖4-7展示了ALU的簡單結(jié)構(gòu)。

圖4-7 算術(shù)邏輯單元示例
操作數(shù)只是可以表示數(shù)字的位。操作碼是一個數(shù)字,它告訴ALU要將哪個運算符應用于操作數(shù)。當然,結(jié)果就是我們對操作數(shù)應用運算符時得到的結(jié)果。
條件碼包含與結(jié)果有關(guān)的額外信息。它們通常存儲在條件碼寄存器中。我們在第3章中提到過寄存器,它只是一個特殊的內(nèi)存片段,與其他內(nèi)存不同,它住在另一個“街道”上,那條街上有昂貴的定制住宅。典型條件碼寄存器如圖4-8所示。方框頂部的數(shù)字是位編號,可以很方便地指示位。注意有些位沒有使用,這種情況并不罕見。

圖4-8 條件碼寄存器
如果最后一個操作的結(jié)果是負數(shù),則N位被設(shè)置為1。如果最后一個操作的結(jié)果為0,則Z位被設(shè)置為1。如果最后一個操作的結(jié)果造成了溢出或下溢,O位被設(shè)置為1。
表4-1展示了ALU的具體功能。
表4-1 示例算術(shù)邏輯單元操作碼

ALU可能看起來很神秘,但實際上它只是一些選擇器中的邏輯門。圖4-9展示了ALU的總體設(shè)計,為了簡單起見省略了一些復雜的功能。

圖4-9 ALU部分內(nèi)部結(jié)構(gòu)
4.3.2 移位寄存器
你可能已經(jīng)注意到表4-1中的移位操作。左移使每一位向左移動一個位置,丟棄最左邊的位,最右邊的空位置移入一個0。如果把01101001(10510)左移一位,將得到11010010(21010)。這是非常方便的,因為把一個數(shù)字左移一個位后得到的數(shù),就是把它乘以2后的數(shù)。
右移使每一位向右移動一個位置,丟棄最右邊的位并將0移到最左邊的空位置。如果把01101001(10510)右移1位,將得到00110100(5210)。右移一位的結(jié)果是將這個數(shù)除以2并去掉它的余數(shù)。
經(jīng)常需要左移時會丟失MSB(最高有效位)值,經(jīng)常需要右移時會丟失LSB(最低有效位)值,因此MSB值和LSB值保存在條件碼寄存器中。我們假設(shè)CPU把這些保存在O位。
你可能已經(jīng)注意到,除這些移位指令之外,ALU中的所有內(nèi)容看起來都可以用組合邏輯實現(xiàn)。你可以用觸發(fā)器來構(gòu)建移位寄存器,其中的內(nèi)容每計算機時鐘移位一位。
順序移位寄存器(如圖4-10所示)速度很慢,在最壞的情況下它移動每位需要一個計算機時鐘。

圖4-10 順序移位寄存器
我們可以通過使用邏輯構(gòu)件之一的選擇器(參見圖2-47)完全用組合邏輯構(gòu)造桶式移位器來解決這個問題。要構(gòu)建一個8位移位器,我們需要8個8:1選擇器。
每個位要有一個選擇器,如圖4-11所示。

圖4-11 組合桶式移位器
右移量由S0-2提供。可以看到,在沒有移位的情況下(S為000),輸入位0(I0)被傳遞到輸出位0(O0),I1傳遞到O1,以此類推。當S為001時,輸出右移1位,因為這是輸入連接到選擇器的方式。當S為010時,輸出右移2位,以此類推。換言之,我們有8種可能的連接方式,但只需選擇一種我們想要的。
你可能會好奇為什么我一直在展示這些邏輯圖。在集成電路設(shè)計系統(tǒng)中,類似門、多路輸出選擇器、多路選擇器、加法器、鎖存器等功能都是預先定義好的。它們的用法和舊的元件類似,只是不用把第2章提到的7400系列零件粘在電路板上,而是用設(shè)計軟件把類似的元件組裝成一個芯片。
你可能已經(jīng)注意到我們的簡單ALU中沒有乘法和除法運算。那是因為乘法和除法要復雜得多,而且不能向我們展示我們還沒有看到過的東西。乘法可以通過重復加法來完成,也可以通過級聯(lián)桶式移位器和加法器來構(gòu)建組合乘法器,但請記住左移會將數(shù)字乘以2。
移位器是實現(xiàn)浮點運算的一個關(guān)鍵元素,指數(shù)用于移動尾數(shù)以對齊二進制點,以便它們可以相加、相減等。
4.3.3 執(zhí)行單元
計算機的執(zhí)行單元,也稱為控制單元,是計算機里的指揮中心。ALU自身并不能發(fā)揮作用,需要有指令指示它應該怎么做。執(zhí)行單元從內(nèi)存中正確的位置獲取操作碼和操作數(shù),告訴ALU要執(zhí)行哪些操作,并將結(jié)果放回內(nèi)存中。希望它能以某種有用的方式完成所有這些工作。
執(zhí)行單元如何做到?我們給它一個指令列表,比如“將位置10的數(shù)字與位置12的數(shù)字相加,并將結(jié)果放入位置14。”執(zhí)行單元在哪里找到這些指令?在內(nèi)存里!這種形式的計算機在技術(shù)上稱為存儲程序計算機。它起源于英國奇才艾倫·圖靈(Alan Turing)(1912—1954)的作品。
是的,我們還有另一種方法來看待和解釋位。指令是指示計算機做什么的位型。位型是特定CPU設(shè)計的一部分,它們不像數(shù)字那樣是一些通用的標準,所以Intel Core i7 CPU對于inc A
指令的位型可能與ARM Cortex-A CPU的不同。
執(zhí)行單元如何知道在內(nèi)存中何處查找指令?執(zhí)行單元使用一個程序計數(shù)器(Program Counter, PC),它有點像郵遞員,或者像一個標有“你在這里”的大箭頭。如圖4-12所示,程序計數(shù)器是一個寄存器,是特殊“街道”上的一塊內(nèi)存。程序計數(shù)器是由一個計數(shù)器(見3.1.6節(jié))而非一個普通寄存器(見3.1.7節(jié))構(gòu)造的。你可以將它視為具有額外計數(shù)功能的寄存器。

圖4-12 程序計數(shù)器
程序計數(shù)器包含一個內(nèi)存地址。換句話說,它會指向或引用內(nèi)存中的一個位置。執(zhí)行單元從程序計數(shù)器引用的位置獲取指令。有些特殊的指令可以改變程序計數(shù)器的值。除非正在執(zhí)行某個指令,否則在指令執(zhí)行完畢后程序計數(shù)器值將遞增(即將一條指令的大小加到其中),以便下一條指令從下一個內(nèi)存位置中產(chǎn)生。請注意,當電源打開時,CPU有一些初始程序計數(shù)器值,通常為0。我們在圖3-17中看到的計數(shù)器具有支持所有這些功能的輸入。
這一切就像尋寶一樣。計算機進入內(nèi)存中的某個位置并找到一個“紙條”。計算機讀取那張“紙條”后,會被“紙條”告知該做些什么,然后到其他地方去拿下一張“紙條”,以此類推。
- ASP.NET Web API:Build RESTful web applications and services on the .NET framework
- Leap Motion Development Essentials
- 程序員數(shù)學:用Python學透線性代數(shù)和微積分
- 實戰(zhàn)Java高并發(fā)程序設(shè)計(第3版)
- HTML5入門經(jīng)典
- Getting Started with NativeScript
- RealSenseTM互動開發(fā)實戰(zhàn)
- Instant Debian:Build a Web Server
- Using Yocto Project with BeagleBone Black
- Java從入門到精通(視頻實戰(zhàn)版)
- 網(wǎng)頁設(shè)計與制作
- Clojure Data Structures and Algorithms Cookbook
- C#網(wǎng)絡(luò)編程高級篇之網(wǎng)頁游戲輔助程序設(shè)計
- H5頁面設(shè)計與制作(全彩慕課版·第2版)
- Raspberry Pi開發(fā)實戰(zhàn)