天天看點

計算機組成原理筆記(王道考研) 第四章:指令系統

内容基于中國大學MOOC的2023考研計算機組成原理課程所做的筆記。

感謝LY,他幫我做了一部分筆記。由于聽的時間不一樣,第四章前的内容看起來可能稍顯啰嗦,後面會記得簡略一些。

西電的計算機組織與體系結構課講法和王道考研的課不太一樣,要應付校内考試建議還是跟着老師學比較好。以下是20年西電計科院車向泉老師這門課的錄播下載下傳連結(請勿将錄像上傳到B站等網站!!):

連結:https://pan.baidu.com/s/1bFs3ajhy8ZcbHopS9izGsw

提取碼:fdez

期中考試占20分,一般隻考前兩章内容,期末考試占60分,一般前兩章内容不考,考察内容一般考前的複習課都會講清楚,請務必認真聽複習課。

其他各章節的連結如下:

計算機組成原理筆記(王道考研) 第一章:計算機系統概述

計算機組成原理筆記(王道考研) 第二章:資料的表示和運算1

計算機組成原理筆記(王道考研) 第二章:資料的表示和運算2

計算機組成原理筆記(王道考研) 第三章:存儲系統

計算機組成原理筆記(王道考研) 第四章:指令系統

計算機組成原理筆記(王道考研) 第五章:中央處理器

計算機組成原理筆記(王道考研) 第六章:總線

計算機組成原理筆記(王道考研) 第七章:輸入輸出系統

其他各科筆記彙總

指令系統

通過之前的學習知道現代計算機的結構大緻上可以分為這樣的幾個版塊。通過第二章的學習已經知道了運算器如何實作加減乘除,移位運算這些操作。而通過第三章的學習又知道了資料如何存放在各種各樣的存儲器裡面,然後CPU又是如何從存儲器當中取走資料的。從這一章開始要學習CPU的控制器大緻有什麼樣的功能,還有各種功能的基本原理。之前說過控制器有兩個很重要的功能,第一個功能是解析各種各樣的指令,然後根據不同的指令指揮其他部件協調地工作,是以這一章會重點探讨控制器需要支援的指令應該怎麼設計。下一章再來具體地探讨控制器是如何控制和協調各種部件,讓它們配合地工作的

計算機組成原理筆記(王道考研) 第四章:指令系統

第一章介紹了計算機的工作原理,我們用進階語言寫的一段代碼被編譯後可以形成一系列與之對等的機器指令,除了指令之外還會有一些資料同時被放到主存裡。程式執行的過程其實就是CPU執行這些一條一條的機器指令。可以看到任何一條指令都會由操作碼和位址碼兩部分組成。操作碼指明了此時需要做什麼,位址碼指明了這個操作的運算對象,不過有的指令不需要位址碼(如停機)。是以可以看到即便是對于同一台計算機,這台計算機所支援的指令類别也是千差萬别的。各種各樣的指令應該如何設計,這就是這一章要探讨的問題

在下一小節中會着重探讨指令的格式

指令格式

計算機組成原理筆記(王道考研) 第四章:指令系統

指令的定義

計算機組成原理筆記(王道考研) 第四章:指令系統

需要注意的是不同體系結構的計算機所能支援的指令集是不一樣的。大家應該都聽說過x86,ARM這兩個名詞,Intel系列的CPU就是x86架構的,現在使用的智能手機基本都是ARM架構。這兩種架構所能支援的指令類型和指令集是不一樣的,是以這才導緻了在個人電腦PC上運作的各種各樣的軟體不能直接運作在手機上面,因為電腦裡面運作的軟體其實是基于x86架構的指令實作的,而手機裡所運作的那些軟體是基于ARM架構所支援的另一種指令集實作的

2020年蘋果開發者大會上蘋果公司宣布說接下來蘋果電腦會逐漸抛棄Intel的晶片,轉而使用它們自己設計的基于ARM架構的CPU。這樣的轉換就意味着在未來蘋果電腦上很有可能會支援蘋果手機上的應用
CPU所能支援的指令集應該怎麼設計,這個問題會在計算機體系結構那門課裡重點探讨。計算機組成原理這門課裡隻會簡要地了解關于指令設計所需要考慮的一些問題

指令格式

計算機組成原理筆記(王道考研) 第四章:指令系統

指令 - 按位址碼數目分類

計算機組成原理筆記(王道考研) 第四章:指令系統

零位址指令

計算機組成原理筆記(王道考研) 第四章:指令系統

一位址指令

計算機組成原理筆記(王道考研) 第四章:指令系統
O P ( A 1 ) → A 1 OP(A_1)\to A_1 OP(A1​)→A1​:CPU首先會從 A 1 A_1 A1​所指向的主存單元當中取出相應的資料,對這個資料執行OP,也就是這個操作符所指明的相對應操作,得到運算結果之後再把運算結果放回 A 1 A_1 A1​所指向的主存單元。執行這樣的指令需要進行3次訪存,第一次訪存是從主存當中取出這條一位址指令,然後第二次訪存是根據 A 1 A_1 A1​所指的内容去讀出 A 1 A_1 A1​這個位址所對應的主存單元,而第三次訪存就是得到了結果之後把運算結果再寫回 A 1 A_1 A1​
( A C C ) O P ( A 1 ) → A C C (ACC)OP(A_1)\to ACC (ACC)OP(A1​)→ACC:其中一個操作數會由位址碼顯式地指明,而另一個操作數會隐含在ACC當中。這一類指令所需要做的事情就是把ACC裡面存放的資料還有 A 1 A_1 A1​所指明的位址當中存放的資料進行相應的操作運算,然後再把運算的結果存回ACC當中。完成這樣的指令隻需要2次訪存,第一次是從主存當中取出指令,第二次訪存是根據 A 1 A_1 A1​所指向的位址從主存當中讀出操作數。由于最後是把運算結果存回ACC當中,是以不需要訪存
後面幾小節中就不再對指令含義進行具體說明了

二、三位址指令

計算機組成原理筆記(王道考研) 第四章:指令系統

三位址指令和二位址指令非常類似,二位址指令當中會把最終的運算結果預設存回 A 1 A_1 A1​所指向的位址,而三位址指令當中會顯式地給出最終的運算結果要存放到哪個位置

四位址指令

計算機組成原理筆記(王道考研) 第四章:指令系統

指令 - 按指令長度分類

計算機組成原理筆記(王道考研) 第四章:指令系統

指令 - 按操作碼長度分類

計算機組成原理筆記(王道考研) 第四章:指令系統

指令 — 按操作類型分類

計算機組成原理筆記(王道考研) 第四章:指令系統

本質上4一類的指令實作的就是程式執行流的改變,正常來說程式是一條一條指令順序執行的,但是寫程式時難免會遇到if-else或者某些函數調用的情況,在這種情況下程式的執行流就不是順序的,有可能會發生跳轉。執行轉移類的指令最終都會導緻PC的值發生改變,因為PC指明下一條指令的存放位址,是以要改變程式的執行流本質上就是改變PC的值

算術邏輯操作類和移位操作類可以被稱為運算類

下一小節會基于定長指令字結構和可變長操作碼這兩個條件來設計一個指令系統

擴充操作碼指令格式

計算機組成原理筆記(王道考研) 第四章:指令系統

下面來看一下如何設計這種指令格式的指令集

擴充操作碼

假設每個指令字長為16位,每個位址碼占4位。那麼如果要設計一些三位址指令,就意味着3個位址碼總共會占12位,由于指令總長是16位,隻會剩餘4位用來表示三位址指令的操作碼。4位操作碼最多可以表示 2 4 2^4 24=16種狀态,也就是說三位址指令最多可以設定16條。但是如果還想設計二位址,一位址,零位址指令,那麼必須保留4個操作碼全為1這種狀态碼留作擴充操作碼來使用,也就是說最多隻能有15條三位址指令,操作碼的範圍應該是0000$\sim$1110,這麼做是因為還需要添加一些二位址指令

所有的二位址指令開頭的4位一定是全1,這樣就可以了解為什麼三位址指令當中要保留一個全1的狀态。事實上CPU在取得一條指令時一定是直接讀入16位。根據開頭的這幾位是否為全1,CPU就可以判斷這是一條三位址指令還是二位址指令。如果開頭的4位是全1而後面的這4位不是全1那這一定是一條二位址指令

這裡也會發現隻設定了15條二位址指令,後面的這4位全1的這種狀态會留下來作為擴充。對于所有的一位址指令來說,前邊的8位都會是全1。同樣地這種設計是為了能夠讓CPU判斷這是一條幾位址的指令

同樣地一位址指令也隻能取15條,最後這4位全1的狀态會用作拓展為零位址指令,這樣目前面的12位都是1時就說明這是一條零位址指令。零位址指令就可以取後面的4位為全0一直到全1總共16種狀态,因為不需要再往後拓展了

當然這裡隻是給出了其中一種擴充操作碼的設計方法,還可以有其他的設計方法,等下再補充

計算機組成原理筆記(王道考研) 第四章:指令系統

這裡需要強調的東西見下圖

計算機組成原理筆記(王道考研) 第四章:指令系統
二位址指令的操作碼是前邊的8位,這是一個比較長的操作碼,相比之下三位址指令的操作碼隻有4位,是以三位址指令的操作碼是更短的操作碼。對于二位址指令前邊的4個bit都是全1,也就意味着三位址指令的這4個操作碼也不能是全1的狀态,否則就不滿足上面的第一個條件

現在再基于剛才那個條件來設計另外一種擴充操作碼,同樣地指令字長固定為16位,然後每一個位址碼規定需要4位。現在要求設計出具有15條三位址指令、12條二位址指令、62條一位址指令、32條零位址指令的一個擴充操作碼

對于三位址指令需要保留後面的12位用來表示三個位址,那麼總共16位的指令就隻會剩下開頭的4位用來表示操作碼。由于需要表示15條三位址指令,這個操作碼的範圍就應該是0000$\sim$1110,總共有15種狀态,然後會留下4個全1作為擴充操作碼

接下來二位址指令隻需要有12條。首先對于二位址指令,它開頭的4個bit一定是全1。接下來由于隻需要保留2個位址,每個位址是4位,是以隻能用中間的這4位來表示12條二位址指令。那可以取0000$\sim 1011 ,翻譯成十進制就是 0 1011,翻譯成十進制就是0 1011,翻譯成十進制就是0\sim$11這12種狀态來分别對應12條二位址指令的操作碼

此時大于1011的數還剩下1100、1101、1110、1111,可以發現剩餘這幾種狀态最高的這兩位都是全1,是以接下來開頭的6位都是全1就超出了二位址指令的範圍。接下來要設計一位址指令,一位址隻需要保留最後的4位來表示位址,是以對于一位址指令可以用這裡剩下的6個bit來表示不同的一位址指令。總共需要有62條一位址指令,是以隻需要用這6個bit來分别表示0$\sim 61 ,用這 62 種狀态來表示一位址指令,對應的二進制是 000000 61,用這62種狀态來表示一位址指令,對應的二進制是000000 61,用這62種狀态來表示一位址指令,對應的二進制是000000\sim$111101,這就是0到61的表示範圍

在下表中給出了 A 1 A_1 A1​和 A 2 A_2 A2​這兩個部分可以取得的兩個合法的範圍,其實和剛剛說的是同一個意思。隻不過剛剛這種描述是描述了這整整6位所能表示的範圍,而在這個表當中以4位為一組來分别描述可以取得的範圍

可以看到需要62條一位址指令,根據剛才的分析可以知道如果前面的這11位全都是1的話就超出了一位址指令的範圍。最後需要32條零位址指令,那麼現在剩下的這5個bit剛好可以表示0到31這個數字範圍,是以零位址指令的範圍就是後邊這5個bit分别是全0一直到全1這32種狀态

這是另一種擴充操作碼的設計方式,需要根據每一種位址指令要有多少條來設計出合理的擴充操作碼

接下來看一下對于這種設計方式來說CPU是如何解析一條指令的,首先CPU讀入一條指令一定是讀入了16個bit,然後接下來CPU會首先判斷這16bit當中的前4位,如果前4個bit不是全1的狀态,那麼就說明這是一條三位址指令,那接下來CPU會根據這4位的訓示,按照三位址指令的規則去執行這條指令

另一種情況,如果CPU檢測到開始的這4位是4個全1,那麼接下來CPU會檢查後面的兩位是不是全1。如果不是全1的話就意味着這是一條二位址指令,那麼CPU就可以根據前8位來判斷出這是一條什麼樣的二位址指令

如果CPU檢測到前面的6位都是1,那麼它還會繼續檢測後面跟着的這5位是不是也是全1。如果這5位不是全1就意味着這是一條一位址指令,那CPU就可以根據前面的12個bit來判斷這是一條什麼樣的一位址指令,然後根據這個指令進行相應的操作

最後一種情況,如果CPU發現前面的這11位都是全1就可以确定這是一條零位址指令,那麼就根據這一整串操作碼的資訊來判斷這條零位址指令需要做什麼,然後CPU執行相應的操作

這種方式保證了操作碼更短的指令不可能是操作碼更長的指令的字首,這樣CPU在解析這些指令時就不會出現歧義

接下來看一下計算的問題。對于擴充操作碼如果位址長度是 n n n位(如這個例子中位址的長度是4位),那麼如果上一層留出 m m m種狀态,下一層就可以擴充出 m × 2 n m\times 2^n m×2n種狀态。下面解釋一下這是什麼意思

首先三位址指令需要用開頭的4bit表示操作碼,4bit可以表示16種狀态,但是會留出一種狀态也就是4個全1作為下一層的擴充。是以下一層的二位址指令可以用4個全1再加上4個bit的資訊來表示這是哪一種指令,4個bit總共可以表示16種狀态,而上一層留下的擴充狀态是1種,是以這一層總共可以表示的二位址指令就有 1 × 2 4 1\times 2^4 1×24=16種可能性,然而隻取其中的12種表示二位址指令,也就是留下了16-12=4種狀态作為下一層的擴充。是以下一層的一位址指令可以有 4 × 2 4 4\times 2^4 4×24=64種狀态,隻取其中的62種狀态來表示一位址指令,留下2種狀态作為下一層的擴充。是以下一層的零位址指令就可以有 2 × 2 4 2\times 2^4 2×24=32種狀态

計算機組成原理筆記(王道考研) 第四章:指令系統

指令操作碼

計算機組成原理筆記(王道考研) 第四章:指令系統

指令尋址

計算機組成原理筆記(王道考研) 第四章:指令系統
這裡的1了解為1個指令字長,實際加的值會因指令長度、編址方式而不同。後面會對這一點做具體說明

經過之前幾個小節的練習,我們已經知道了指令在計算機内部是如何表示的。在邏輯上一條指令可以被分為操作碼和位址碼兩大部分,其中位址碼有可能會有多個。用進階語言寫的程式最終一定會被轉換為用機器語言表示的一條條指令,而這些指令序列在主存當中被順序地存放。之前說過一個計算機當中有可能各條指令的長度不一樣,那麼計算機在執行這些指令序列時如何确定下一條指令的存放位址?這就是這一小節要探讨的所謂指令尋址的問題。CPU可以通過順序尋址或者跳躍尋址這兩種方式來确定下一條指令在主存當中的存放位置

第一章就提到過CPU内部有一個很重要的寄存器叫程式計數器PC(program counter),用PC來表明接下來應該執行哪一條指令。剛開始PC會被指向這個程式的第一條指令,接下來CPU取得這條指令之後會讓PC的值自動加1也就是指向下一條應該執行的指令。用這樣的方式可以把這些指令一條一條地往後順序執行。是以正常情況下CPU确定下一條指令存放位址的方式很簡單,隻需要讓PC的值加1,因為正常情況下這些指令都是順序執行的

現在我們要注意這樣的一些細節

在第一章的例子中給主存的這些存儲單元編址時是按存儲字,即按字編址的。每一個存儲字可以存放2個位元組的資料,所有這些指令也剛好都是占2個位元組。是以這個例子比較特殊的是隻需要簡單地讓PC不斷地加1就可以找到下一條指令存放的存儲字。如果主存按位元組編址就意味着每一條指令會占2個位址,這樣每次讓PC簡單地加1就不行了,需要加2,這是第一種值得考慮的情況。還有第二種情況,如果這個系統當中采用變長指令字結構,那尋找下一條指令的存儲位址又會變得更複雜,這樣PC的值簡單地加1肯定就不行了

總之對于指令尋址這個問題,并不是讓PC的值簡單地加1就可以。不過有一點是可以确定的,PC始終都是指向下一條應該執行的指令的存放位址

計算機組成原理筆記(王道考研) 第四章:指令系統

指令尋址

一條一條的機器指令在記憶體當中被順序地存放。下圖的每一行都是16bit(2B),假設每一行剛好就是一個存儲字,然後在這個系統當中采用定長指令字結構,并且指令字長=存儲字長=16bit=2B。另外還規定這個主存是按字編址的。這樣兩條指令之間的位址剛好就相差1,也就是剛才所說的最簡單的情況,這樣CPU每取走1條指令之後隻需要簡單地讓PC的值加1指向下一條指令就可以

計算機組成原理筆記(王道考研) 第四章:指令系統

這裡用二進制機器語言表示指令,可以把它換成比較好看的彙編語言的形式。每一條彙編語言和機器語言是對應的,同樣有操作碼和位址碼,每一條指令占一個存儲字

接下來模拟一下這個程式的執行過程,由于第一章有過說明,直接看下圖即可,此處詳細講解略過不記

注意PC指向的是下一條應該被執行的指令所存放的位址,并不是目前執行的這條指令的位址。當正在執行的指令結束之後,CPU才會根據PC所指向的位置去取下一條指令同時執行這條指令,另外也讓PC的值繼續加1指向下一條指令。總之就是每取走一條指令都讓PC加1,同時CPU執行目前這條指令
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

接下來把設定的這幾個條件改一下,其他不變,主存按位元組編址。這意味着每一條指令會占2個位址,如第一條指令的前8個bit對應位元組位址是0,後8個bit對應位元組位址是1。這樣CPU每取一條指令之後應該讓PC的值加2

總之如果主存的編址方式發生改變,那對PC的處理也會相應地發生改變

計算機組成原理筆記(王道考研) 第四章:指令系統

到目前為止看的是定長指令字結構,也就是每一條指令的長度都是确定不變的,接下來再看一下如果這個系統采用變長指令字結構,同時也是按照位元組編址,那這種情況下PC的值又應該怎樣變化呢?

下圖中具有相同顔色的存儲字就表示這幾個存儲字共同組成了一條指令,這種情況下不同指令的指令字長是不一樣的,不再是固定的2B

來分析一下這些指令的執行過程,剛開始PC的值肯定是指向第一條指令的存儲位址0,由于CPU無法确定目前指向的這條指令到底占幾個存儲字,CPU可以首先讀入第一個字的内容。由于操作碼被包含在了第一個字裡面,是以CPU可以根據這裡面隐含的操作碼來判斷出這條指令到底是幾位址的指令,就可以确定這條指令總共占多少個位元組。接下來CPU還會讀入後面的位元組,這樣就得到了完整的指令。在取指令階段結束之後CPU會把PC的值加上n,這裡的n指的是剛才取出的這條指令的總位元組數(因為是按位元組編址的,是以需要加上總位元組數)。這樣的操作就導緻PC指向了下一條指令的存放位址

這就是采用變長指令字結構,按位元組編址的處理方式。由于無法預先判斷目前要執行的這條指令的指令字長到底是多長,是以CPU都會先讀入一個字,然後接下來根據指令的類型,有可能還要進行多次訪存讀入一條指令後續那幾個字

計算機組成原理筆記(王道考研) 第四章:指令系統

目前為止介紹的指令尋址方式都可以統一歸為順序尋址,因為到目前為止介紹的例子都是一條一條往後順序地執行各個指令。接下來再來介紹第二種指令尋址方式跳躍尋址,可以根據轉移指令指出接下來應該執行的指令在什麼位置。還是結合剛才使用的例子繼續往下分析,事先的規定見下幾張圖

前面的三條指令隻是進行簡單的算術運算和取一個數的操作,并不會改變整個程式的執行流。直接看下圖即可,此處詳細講解略過不記

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

對于3這個位址所存放的指令就不一樣了,當CPU執行到3位址所存放的這條指令時,首先CPU取出這條指令之後,同樣會讓PC的值加1,也就是指向4這條指令。但是CPU執行這條指令的過程中會發現這條指令是一條無條件轉換指令JMP(jump,跳轉的意思)。JMP後面跟着的位址7意味着下一條應該執行的指令存放在哪個位置(有點類似于C語言裡的goto語句),是以執行這條指令的效果就是讓PC的值強行變更為7,執行了這條指令之後CPU就會根據PC所指向的位置去取出下一條應該執行的指令

是以JMP這條指令改變了程式的執行流,通過這種轉移指令讓CPU跳躍着找到了下一條指令的存放位置

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

是以前邊每一次PC加1的這種指令尋址方式就是順序尋址。而通過轉移類指令改變了程式的執行流的這種指令尋址方式就是跳躍尋址

計算機組成原理筆記(王道考研) 第四章:指令系統
除了無條件轉移指令JMP,還有函數調用指令CALL也會改變程式的執行流

資料尋址

計算機組成原理筆記(王道考研) 第四章:指令系統
這裡給出的是指令執行期間需要訪存多少次,排除了取指令所需要的那一次訪存操作

需要重點關注的是如何根據形式位址得到最終的有效位址,不同的尋址方式對形式位址A的解讀方式也不一樣

指令尋址與資料尋址

之前說過一條指令邏輯上由一個操作碼和若幹個位址碼組成。上一小節的例子當CPU執行到JMP這條指令時,它會知道接下來需要把PC的值改為7,這也就意味着接下來要執行的指令存放在主存位址為7的這個地方,那對于這個例子來說JMP這條指令的位址碼所指向的就是一個真實的位址。這個例子給的這個程式這段代碼是從主存位址為0的這個單元開始往後存儲的,剛好JMP指令想要跳轉到的那條指令的位址就是7,是以把PC的值直接改為7并不會導緻這個程式運作錯誤

但是同一時刻計算機主存裡面可能存在很多正在并發運作的程式,這也就意味着無法保證目前要運作的這個程式一定可以從位址為0的這個地方開始存儲。是以假設要運作的這段程式是從主存位址為100的地方開始存儲的,那麼JMP這條指令的位址碼的含義會出現錯誤。如果依然按照之前的解釋方式來解讀位址碼的真實含義,那CPU執行到這條指令時就意味着執行了103這條指令之後,接下來需要跳轉到位址為7的地方運作這個地方所存儲的指令,這顯然是錯誤的,因為這個程式都是從100往後存儲的,位址為7的那個地方所存儲的指令應該從屬于其他程式

那對于這個例子要如何解讀這個位址碼7的含義?可以這麼來看,這段程式代碼是從位址單元100這個地方開始存儲的,這是這個程式的起始存放位址。是以這個地方的7可以解讀為基于這個起始位址往後的一個偏移量,也就是這個位址碼的含義應該是100再加上7來往後偏移7,用這樣的方式解讀這個位址碼就可以得到期待的運作順序

是以不能簡單粗暴地認為一條指令所包含的位址碼指向的就是一個真實的位址。有的情況下需要改變對這個位址碼的解讀方式

再看一個例子,現在把這條JMP指令的位址碼改為3,當CPU執行這條指令之後依然期待接下來執行的是107這條指令,那這裡的3應該怎麼解讀?目前CPU正在執行的是103這條指令,上一小節說過CPU每取出一條指令之後都會讓PC的值自動加1,這也就意味着當CPU執行這條指令時,PC應該指向104這個位置。是以對這個地方的位址碼3正确的解讀方式是從PC所指向的位址往後偏移3個機關,104+3=107。在這個例子當中對位址碼的解讀方式又發生了變化

下圖中間的解讀方式是基于程式的起始位址往後偏移多少個位址,而右邊這種解讀方式是基于PC往後偏移多少個位置。通過接下來幾個小節的學習會知道計算機常用的資料尋址方式會有哪些

計算機組成原理筆記(王道考研) 第四章:指令系統

現在新的問題出現了,給出的指令由操作碼和位址碼這兩部分組成,但是剛才說過資料的尋址方式也就是位址碼的解釋方式可能會有很多種,那如何區分一條指令的位址碼應該用什麼方式解讀?

通常來說可以在位址碼的前面加上幾個bit位用來辨別位址碼應該采用什麼樣的尋址方式。這裡會學習10種尋址方式,是以隻需要用4個bit來辨別就可以。是以在原有的指令基礎上再增加上幾個bit位來表示資料尋址的方式,根據加上的中間幾個bit的數值可以确定用什麼樣的方式解讀形式位址來得到最終的真實位址

EA表示有效位址,A表示形式位址

這是對于一位址指令,如果是多位址指令,由于其中會包含多個形式位址,對各個形式位址的解讀方式可能會不一樣,是以每一個形式位址的前邊都會配上一個尋址特征

在接下來的講解中要認識10種資料尋址的方式,也就是10種形式位址的解讀方式,隻需要基于一位址指令來講解和分析,二位址指令是一樣的原理

為了講解友善,接下來預設講解的計算機系統當中指令字長=機器字長=存儲字長,并且假設最終想要找到的操作數是3
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

直接尋址

直接見下圖即可,此處詳細講解略過不記

計算機組成原理筆記(王道考研) 第四章:指令系統
中間有4個bit用來表示接下來形式位址應該采用直接尋址的方式解讀
這個資料讀出之後是放到寄存器當中,是以寫入寄存器不算訪存

間接尋址

指令裡面給出的形式位址A指向了某一個主存單元,在這個主存單元當中存儲了最終要取得的操作數的真正的位址

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

兩次間接尋址中,指令裡面的形式位址A指明了第一個位址資訊所存放的主存單元。如果這個主存單元裡面儲存的第一個比特位是1,就意味着還要繼續往下尋址,以這個存儲單元裡邊存儲的資料作為位址去查找下一個存儲單元,接下來這個存儲單元的剛開始這一位是0,就意味着這個存儲單元所儲存的位址就是最終的操作數的有效位址,是以再根據這個位址資訊找到最終的操作數

A表示這個位址,(A)表示的是這個位址所指向的主存單元裡面的資料
對于第二個優點的了解涉及彙編語言,這裡就不展開了

寄存器尋址

這裡給出的位址碼并不是指向了某一個主存單元而是指向了某一個寄存器的編号。根據寄存器編号直接去寄存器裡面找資料

計算機組成原理筆記(王道考研) 第四章:指令系統
CPU内部會有很多通用寄存器,它們都有自己的編号。由于寄存器數量不可能太多,是以編号數目也不會特别大,用很短的幾個bit就可以表示所有寄存器的編号,整個指令的字長就會變得比較短

寄存器間接尋址

直接見下圖即可,此處詳細講解略過不記

計算機組成原理筆記(王道考研) 第四章:指令系統

隐含尋址

結合第一章的例子來了解,有的指令顯式地給出的位址隻指明了其中一個操作數存放在什麼位置,另一個操作數會預設隐含在ACC中

計算機組成原理筆記(王道考研) 第四章:指令系統

立即尋址

想要的操作數會直接被顯式地寫在指令當中,形式位址A就是操作數本身而不是操作數的位址

計算機組成原理筆記(王道考研) 第四章:指令系統

這裡尋址特征部分寫了一個"#“,大家在指令當中看到”#"時就意味着後面跟的這段形式位址并不是位址而是立即數

很多彙編語言裡面如果一個指令後面跟了一個"#“,然後後面又緊跟了一個數字(如LOAD #985),則後面跟的這串數字是一個立即數而不是一個位址。也正是因為彙編語言裡面經常用這樣的方式來表示一個立即數,是以我們在計算機組成原理這門課裡也會用一個”#"來特别地辨別這是立即尋址方式

資料尋址2(偏移尋址)

計算機組成原理筆記(王道考研) 第四章:指令系統

上一小節介紹了6種資料尋址的方式,這一小節會介紹剩下3種,這3種尋址方式都可以歸為偏移尋址

上個小節剛開始時舉過這樣的3個例子,最左邊的例子采用直接尋址的方式直接通路這條指令所指向的位置。而中間的例子由于這段程式的起始存放位址是100,是以對JMP這條指令進行解析時,對于7這個位址碼就應該了解為從起始位址開始往後偏移7個機關。而最右邊的例子可以把形式位址3了解為從目前PC所指向的位址往後偏移3個機關

右邊這兩個例子都有一個特征,就是以某個特定的位址作為起點,然後加上形式位址所表示的“偏移量”得到最終的有效位址

計算機組成原理筆記(王道考研) 第四章:指令系統

這一小節會學習3種尋址方式相對尋址、基址尋址、變址尋址。這三種尋址方式都可以被歸為偏移尋址,因為它們的共同特點是以某一個特定的位址作為起點然後偏移形式位址A這麼多的機關,上圖右邊的兩個例子就分别是基址尋址和相對尋址,而變址尋址會以變址寄存器IX這個寄存器裡存放的位址作為起點再偏移A這麼多的偏移量。這3種偏移尋址的差別在于它們選取的偏移起點不一樣

計算機組成原理筆記(王道考研) 第四章:指令系統

基址尋址

計算機組成原理筆記(王道考研) 第四章:指令系統
基址寄存器會指向目前這個程式的起始存放位址,要得到最終的有效位址隻需要用基址寄存器裡存放的位址再加上形式位址A也就是偏移量。上圖畫了一個ALU算術邏輯單元,也就是說把BR和A這兩個資料送給ALU進行加法邏輯運算就可以得到最終的有效位址EA
有的計算機内部不會專門地設定一個基址寄存器而是使用某一個通用寄存器來代替前者的功能。比如說總共有n個通用寄存器,編号分别為0 ∼ \sim ∼n-1,這條指令當中指明了要采用基址尋址,另外用幾個bit位指明基位址存放在哪一個寄存器當中

目前為止我們已經大緻了解了基址尋址的硬體實作原理,接下來再探讨為何基址尋址有存在的必要

基址尋址的作用

還是第一章的例子,下圖中這條指令的資料尋址方式采用直接尋址,也就是直接去通路5号位址,用這種方式處理可以得到期待的結果

計算機組成原理筆記(王道考研) 第四章:指令系統

但是現在假設這段程式是從記憶體位址100這個地方開始存放的,解析剛才提到的第一條指令的位址碼就不應該采用直接尋址而應該采用基址尋址,基址寄存器BR會指向這個程式在記憶體當中的起始存放位址也就是100這個地方。是以基址尋址的意義在于可以便于程式的“浮動”,就是說這個程式可以從記憶體當中任何一個位址開始往後存放,當這個程式在主存當中的位置發生改變,作業系統隻需要修改BR這個寄存器的内容,永遠讓BR指向目前這個程式的起始位址,這樣這段程式就不用更改,保持原來這個位址碼就可以

有了基址尋址之後就可以很友善地實作多道程式并發運作,因為主存裡面可能會同時存在多個程式的資料,每一個程式的起始存放位置都不一樣

計算機組成原理筆記(王道考研) 第四章:指令系統
每個程式運作之前CPU的BR的值都會被修改為目前運作程式的起始存放位址,而這個資訊通常存放在程序控制塊PCB當中

基址尋址的特點是

計算機組成原理筆記(王道考研) 第四章:指令系統
也就是普通程式員不可以操作BR裡面的值,因為我們寫的應用程式到底被放到記憶體的哪個位置是由作業系統來負責管理的,我們決定不了。而BR指向了應用程式的起始存放位址,是以BR的值顯然應該由作業系統負責管理
普通程式員可以用彙編語言直接讀寫某個通用寄存器的内容。但是如果某一個通用寄存器被指定為基址寄存器,那麼接下來這個通用寄存器裡面的值不可以被随意修改,其中的内容由作業系統負責管理

變址尋址

除了寄存器的名稱,看上去和基址尋址幾乎一模一樣。直接見下圖即可,此處詳細講解略過不記

計算機組成原理筆記(王道考研) 第四章:指令系統

變址尋址的作用

下面通過一個例子來了解變址尋址的作用

假設現在要實作如下代碼的功能,即把數組的 a [ 0 ] ∼ a [ 9 ] a[0]\sim a[9] a[0]∼a[9]元素進行加和存到變量sum裡面。要實作這個循環裡面的10次加法操作可以用10條加法指令來實作,然後最後再把ACC裡面累加的結果放回sum變量裡面。這裡能夠感受到對于這種循環類的操作,如果按照之前知道的老辦法,那麼每一次循環都需要對應一條指令,這就會導緻程式設計很不友善和靈活。比如萬一未來要實作 a [ 0 ] ∼ a [ 19 ] a[0]\sim a[19] a[0]∼a[19]相加,按照這種方法還需要繼續在最後的指令的後面再增加一些加法指令。是以就需要引入變址尋址來實作循環操作

計算機組成原理筆記(王道考研) 第四章:指令系統
位址碼前面打“#”說明目前這條指令采用立即尋址
這裡省略了用來指明這條指令尋址方式的幾個bit

引入變址尋址之後,剛才這段程式可以改造成下圖的樣子,用6條指令就可以實作。此處詳細講解略過不記,隻針對下圖的内容寫了一些批注

  1. 中間的加法指令采用變址尋址,變址尋址就意味着有效位址等于變址寄存器IX裡的位址加上形式位址A,這條指令的形式位址A指向了7這個位置,也就是數組第一個元素的存放位址。現在變址寄存器IX的值是0,故現在執行這條加法指令導緻的結果就是ACC裡的内容0加上(IX)+A=0+7=7這個單元裡的資料(即a[0]的值),然後把相加的結果放回ACC寄存器當中。對照進階代碼就是完成了第一輪的循環
  2. IX的值和立即數10進行比較在硬體層面實作的邏輯暫時還沒有細講,這個問題先留下,在這個小節的最後再補充。這裡隻需要知道進行10和IX的比較本質上就是硬體會進行10-(IX)的操作,接下來這個條件跳轉指令會判斷剛才的計算結果是否大于0,如果大于0就跳轉回2這個位址,即把PC的值改為2
計算機組成原理筆記(王道考研) 第四章:指令系統

變址尋址的特點是

計算機組成原理筆記(王道考研) 第四章:指令系統

基址 & 變址複合尋址

接下來看一種複合的尋址方式,即基址尋址和變址尋址的結合。剛才這個例子當中預設了這個程式是從主存位址為0這個地方開始往後存放的,是以當IX等于2時剛好可以通路到 a [ 2 ] a[2] a[2]這個單元,因為基址7加上變址2剛好等于9

現在假設這段程式從記憶體位址為100的地方開始存放,也就是說第一條指令存放在100, a [ 2 ] a[2] a[2]這個數組元素就應該存放在109這個位址。這時執行這條加法指令就不能隻用變址尋址,還需要結合基址尋址來得到最終的有效位址

要采用基址尋址就需要有基址寄存器,它指向了目前這個程式的起始位址100。之前已經知道了基址尋址和變址尋址的有效位址的計算方式,現在把這兩種尋址方式結合。先進行基址尋址,把目前這條指令當中給出的形式位址A加上位址BR的内容(A=7,(BR)=100)得到107,107已經指向了 a [ 0 ] a[0] a[0]這個元素。接下來在基址的基礎上再進行一次變址尋址,也就是再加上變址寄存器IX裡的内容((IX)=2),得到最終的有效位址109

是以在實際應用當中往往需要多種尋址方式複合着使用的,大家可以把每一種尋址方式了解為是一種函數,因為每一種尋址方式都是要把形式位址A映射為一個有效的真實位址EA,隻不過不同尋址方式的映射規則不一樣。多種尋址方式的複合其實就是相當于把不同映射的規則結合起來,類似于數學裡的複合函數

計算機組成原理筆記(王道考研) 第四章:指令系統

相對尋址

計算機組成原理筆記(王道考研) 第四章:指令系統
由于位址A用補碼表示,是以當A為負時就相當于是在PC的基礎上減掉一個正數,故這種尋址從PC所指的位址往前偏移或者往後偏移都是可以的,因為A可正可負

相對尋址的作用

接下來還是通過一個例子了解相對尋址有什麼作用

先基于上一小節的例子,如果現在想要挪動for循環的位置,站在彙編語言程式員的視角就相當于要把for循環主體的這幾句指令挪一下位置

計算機組成原理筆記(王道考研) 第四章:指令系統

假設挪到下圖的位置,顯然不能再按照直接尋址的方式解析跳轉指令。為了解決這個問題引入相對尋址。相對尋址是在PC所指的位址的基礎上進行偏移,目前CPU正在執行的是跳轉指令,那麼CPU取出這條指令之後,PC的值會自動指向下一條指令也就是M+4這個位址。現在為了讓這個循環能夠正常地工作,我們所期待的結果是讓PC的值從目前PC所指的位址往回偏移4個位址,因為M+4-4就可以回到M。是以把這條跳轉指令的位址碼改為-4,這個位址碼是用補碼表示的

計算機組成原理筆記(王道考研) 第四章:指令系統

現在這條指令采用相對尋址,是以這條指令真正要跳轉到的位址就應該是(PC)+A=M。由于跳轉指令本質上是在修改PC的值,是以會把經過相對尋址得到的有效位址值賦給PC,讓PC重新指回M這條語句,這樣就可以保證for循環正常進行

并且之後無論for循環的這幾句指令被放到程式的哪一個位置,隻要采用這種相對尋址的方式,那麼這條跳轉指令都一定可以讓程式的執行流重新跳轉回加法這個地方。也就是之後無論這段彙編代碼被放到什麼位置都不需要再修改跳轉指令的位址碼,讓它永遠保持-4并且采用相對尋址就可以得到正确的結果

計算機組成原理筆記(王道考研) 第四章:指令系統

這段程式整體變長之後數組元素 a [ 0 ] a[0] a[0]可能就不再存放在7那個位址而是存放到後面的某一個位置,這是不是意味着得修改上面這條加法指令的位址參數?顯然如果每一次挪動代碼都需要修改位址參數,對于程式員來說也是一件很麻煩的事。現實當中如何處理這個問題?

通常可以進行分段,把一個程序的資料分為程式段隻儲存指令代碼和資料段專門存放資料。進行分段之後我們想要通路的那些變量,數組元素在段裡的相對位置就可以保持固定不變,也就是說之前寫好的這條加法指令給出的形式位址不需要改變

相對尋址的特點是

計算機組成原理筆記(王道考研) 第四章:指令系統
之前說過采用基址尋址也可以友善程式的浮動,在基址尋址當中所說的程式的浮動指的是整段程式在記憶體裡的浮動,而相對尋址的程式浮動指的是一段代碼在程式内部的浮動

硬體如何實作數的“比較”

直接見下圖即可,此處詳細講解略過不記,隻針對下圖的内容寫了一些批注

計算機組成原理筆記(王道考研) 第四章:指令系統
  1. 轉移指程式執行流的轉移
  2. 上圖中站在進階語言的視角就相當于a>b這個條件滿足時程式執行流會被轉移到else所包含的這一系列語句當中。站在硬體層面我們執行這條if語句相當于硬體幫我們做了一個a-b的操作,如果a>b,這個減法操作會導緻ZF=0,SF=0,硬體電路會以這兩個bit位作為輸入信号然後通過電路的處理把PC的值指向else所對應的第一條語句,這樣就完成了一個條件轉移指令
  3. je = jump when equal,jg = jump when greater

資料尋址3(堆棧尋址)

計算機組成原理筆記(王道考研) 第四章:指令系統

對于堆棧尋址,當要進行出棧操作時,目前SP所指向的位址就是棧頂元素,也就是想要通路的那個操作數的實際有效位址。而入棧時要先改變SP的值,之後SP所指向的位址才是最終要寫入的有效位址,是以堆棧尋址入棧和出棧時有效位址的确定方式是不太一樣的。當然SP的值加1還是減1這些事情是由硬體自動幫我們完成的,是以也可以說采用堆棧尋址時有效位址就是SP所指向的位址

注意上表寫的是指令執行期間,取指令還需要訪存

堆棧尋址

CPU内部會有專門的堆棧指針SP,存在專門的寄存器當中,即SP這個寄存器指向棧頂元素。是以如果一條指令采用堆棧尋址,那麼就不需要我們顯式地給出操作數的存放位址,它的存放位址隐含在SP這個寄存器當中

系統的堆棧可以有兩種實作方式,一種是設定一組專門的寄存器,每一個寄存器存放一個堆棧元素,另一種是在主存當中劃出一片區域作為堆棧

先來看用一組寄存器實作的堆棧是如何操作的。假設像下圖一樣用4個寄存器實作堆棧,最上面的 R 0 R_0 R0​寄存器是棧頂,最下面是棧底,另外系統當中會有一個專門的寄存器SP指明目前棧頂元素所存放的位置

假設此時整個堆棧已經存滿了,棧頂元素就是 R 0 R_0 R0​裡存放的元素,是以SP應該指向 R 0 R_0 R0​。由于隻有4個寄存器,是以SP隻需要用2個bit就可以表示所有寄存器

計算機組成原理筆記(王道考研) 第四章:指令系統

假設現在想要用堆棧裡的兩個棧頂元素完成一次加法操作,加數和被加數會先被放到ACC和X這兩個寄存器當中,然後通過ALU的計算把結果輸出到另一個寄存器裡面。為了書寫友善,記目前棧頂單元為 M s p M_{sp} Msp​,就是SP所指向的這個存儲單元。現在要把棧頂和次棧頂的元素相加,可以用一條彙編語言指令POP彈出棧頂的元素,這個元素會被存放到ACC寄存器當中導緻ACC的值變為0001,是以這裡也需要指明彈出的元素存放的位置。現在由于棧頂元素彈出,是以需要讓SP的值加1指向次棧頂的元素,這相當于在邏輯上把棧頂元素給删除了

計算機組成原理筆記(王道考研) 第四章:指令系統

參與加法運算的第二個操作數是1001,同樣用POP指令把棧頂元素放到X寄存器當中,這導緻X的值變為1001。接下來同樣地彈出一個元素後讓SP的值加1指向下一個元素,相當于在邏輯上删除了上面的兩個元素

計算機組成原理筆記(王道考研) 第四章:指令系統

現在加法運算所需要的兩個數已經準備好了,接下來執行一條加法指令,加法的結果放到寄存器Y裡面。這就會導緻ALU開始工作,然後把相加的結果輸出到Y這個寄存器當中。最後要把這次加法的運算結果壓回棧頂,壓棧操作會用到彙編語言的PUSH指令,把Y寄存器裡的資料壓回棧頂,這個操作首先要把SP的值減1讓它指向1号寄存器

計算機組成原理筆記(王道考研) 第四章:指令系統

然後再把Y的值放到目前SP所指向的寄存器當中,将裡面的資料覆寫為1010。這樣就用原本這個棧裡的兩個棧頂元素相加得到了一個結果并且又重新壓回棧中

這裡執行的PUSH和POP這兩個指令就使用了堆棧尋址,這兩個指令要通路的操作數所存放的位置被隐含在SP當中。當要彈出一個棧頂元素時就是彈出此時SP所指向的元素,出棧之後SP必須加1。而對于入棧需要讓SP的值減1,然後再把想要存的元素存到SP所指向的這個位址。這就是堆棧尋址,要操作的數會隐含地用SP這個寄存器指明

剛才這個例子規定棧頂處于位址更小的這個方向,還有的題目可能棧頂是在位址更大的方向。大家要能寫出出棧和入棧操作背後所需要進行的一些處理,特别是SP棧頂指針的變化
計算機組成原理筆記(王道考研) 第四章:指令系統

目前為止介紹的這個例子是專門用幾個寄存器來實作堆棧,這種堆棧稱為硬堆棧,還有一種堆棧的實作方式是軟堆棧,會從主存當中劃分出一片區域作為堆棧。對于剛才的POP和PUSH這兩個操作,如果采用軟堆棧則彈出一個棧頂元素和壓入一個棧頂元素都一定需要一次訪存。而如果采用硬堆棧,由于這些棧元素都存放在寄存器當中,是以無論是對棧的壓入還是彈出都不需要進行訪存

顯然采用寄存器實作的硬堆棧速度更快,但是成本高。在實際系統當中通常使用軟堆棧實作

計算機組成原理筆記(王道考研) 第四章:指令系統
程式運作過程中和函數調用還有局部變量相關的資訊都會被儲存在這個程式所對應的軟堆棧當中。是以有了軟堆棧和堆棧尋址才可以實作函數的調用,至于函數調用時需要往堆棧裡面壓入或彈出哪些資訊見資料結構相關内容

進階語言與機器級代碼之間的對應

計算機組成原理筆記(王道考研) 第四章:指令系統

進階語言 —> 彙編語言 —> 機器語言

計算機組成原理筆記(王道考研) 第四章:指令系統
C語言當中的一句代碼很有可能對應好幾條彙編語言指令,而彙編語言指令和機器語言指令之間一一對應

x86彙編語言指令基礎

計算機組成原理筆記(王道考研) 第四章:指令系統

以mov指令為例

計算機組成原理筆記(王道考研) 第四章:指令系統

藍色 —— 寄存器

紫色 —— 立即數

綠色 —— 記憶體位址

紅色 —— 指明讀寫記憶體位址時要讀多少個位元組

中括号裡的内容是主存位址,位址前面通常要指明此次要讀寫多少比特

x86裡的寄存器

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

更多例子

計算機組成原理筆記(王道考研) 第四章:指令系統

常用的x86彙編指令

計算機組成原理筆記(王道考研) 第四章:指令系統

常見的算數運算指令

計算機組成原理筆記(王道考研) 第四章:指令系統
在進行除法運算之前需要把被除數進行位擴充,更高的32位存放在edx,更低的32位存放在eax

關于王道書的解釋

計算機組成原理筆記(王道考研) 第四章:指令系統
在x86彙編語言指令當中不允許兩個操作數同時來自于主存

常見的邏輯運算指令

計算機組成原理筆記(王道考研) 第四章:指令系統

其他指令

計算機組成原理筆記(王道考研) 第四章:指令系統

AT&T格式 v.s. Intel格式

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
如果給出一個指令後面沒有加b、w、l,預設此次讀寫長度為32bit
基址 + 變址 × \times ×比例因子找到想要通路某一個的數組元素,而一個數組元素裡面可能包含很多個變量,用加上偏移量的方式來指明要通路哪幾個位元組

選擇語句機器級表示

程式中的選擇語句(分支結構)

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

無條件轉移指令 —— jmp

計算機組成原理筆記(王道考研) 第四章:指令系統

條件轉移指令 —— jxxx

計算機組成原理筆記(王道考研) 第四章:指令系統

示例:選擇語句的機器級表示

計算機組成原理筆記(王道考研) 第四章:指令系統

曆年真題

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統
f1指的是這個函數的起始位址,也就是它的第一條指令所存儲的位址

擴充:cmp指令的底層原理

計算機組成原理筆記(王道考研) 第四章:指令系統

循環語句機器級表示

用條件轉移指令實作循環

計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第四章:指令系統

用loop指令實作循環

計算機組成原理筆記(王道考研) 第四章:指令系統
不可以用其他的寄存器代替ecx

CISC 和 RISC

通過之前的學習我們已經知道了在一個系統當中指令的格式應該怎麼設計。另外介紹了指令尋址和資料尋址,前者探讨的是如何找到下一條應該執行的指令的位址,後者探讨的是如何解釋指令裡邊所包含的形式位址。通過前面的學習我們可以感受到指令系統的設計其實是很靈活的,這一小節要學習的CISC和RISC就是指令系統的兩種設計方向

計算機組成原理筆記(王道考研) 第四章:指令系統

CISC 和 RISC

直接見下圖即可,此處隻針對下兩圖的内容寫了一些批注,詳細講解略過不記

計算機組成原理筆記(王道考研) 第四章:指令系統
  1. CISC:複雜指令集的計算機系統/RISC:精簡指令集的計算機系統
  2. 複雜指令集的設計方式通常會用于筆記本、桌上型電腦或者一些商業伺服器,因為這些地方可能對功能的複雜性要求更高一些
  3. “存儲程式”這個概念之前提到過,我們可以給定一串基本的指令,把它提前存儲在某個地方。把複雜指令的實作拆解為由基本指令完成的操作,這就是微程式的概念。CPU對外提供的某些複雜的指令功能在内部是由某些更簡單基本的功能組合實作的
計算機組成原理筆記(王道考研) 第四章:指令系統
  1. 由于RISC裡面的這些指令都很簡單,都是一些基本的指令,是以所有的這些指令執行時間都差不多。這個特性可以很友善地實作“并行”和“流水線”技術,這兩個術語的具體含義會在下一章當中進行學習
  2. 由于CISC當中指令的功能很豐富,是以各指令的指令字長是不固定的,可能有很長的指令,也可能有很短的指令。而RISC當中由于各個指令的功能都比較單一,是以可以比較友善的設計出定長指令字結構。之前說過一個指令系統當中如果每一條指令的長度都是相等的,那麼對指令的解析速度也可以得到提升
  3. Load:讀某個主存單元到某個寄存器當中/Store:從某個寄存器當中往主存裡寫一個資料

    由兩種指令系統在可通路指令方面的差異可以知道第一章中舉例的指令系統一定是CSIC,因為該例子中乘法指令也可以訪存。也正是由于這個特性,CSIC當中隻需要比較少的寄存器,而RISC當中需要有比較多的寄存器,這點從第一章中舉例的乘法指令也可以體會的到,CISC裡的乘法指令會直接把需要相乘的數取到某一個寄存器然後緊接着就完成乘法操作,不會過多地占用寄存器。而對于RSIC無論要實作的是加法、乘法還是除法中的哪一種運算都一定需要先用一條指令把資料從主存讀入到某一個寄存器,然後再用一條乘法指令對兩個寄存器的值進行相乘。由此可以看到如果采用RISC,作為程式員也許會長期地占用很多個寄存器

  4. 之前說過CSIC有點類似于有很多庫函數的C語言,你當然可以通過一句代碼調用一個庫函數就完成一個複雜的功能,但是如果這個庫函數實作的不是特别好,執行效率不是很高,你是不能修改庫函數的。而RSIC有點類似于沒有庫函數的C語言,當我們要實作某個複雜功能時不可以直接調用某個庫函數,但是由于我們使用的是C語言最基本的文法,是以完全可以自己用合理的方式來優化程式代碼讓我們的代碼執行起來更高效。這兩種指令系統在目标代碼方面的差別原理都是和C語言類似的
  5. 在第五章會進一步探讨微程式控制,現在隻需要知道組合邏輯控制效率更高
  6. 由于CSIC當中各種指令的執行時間相差比較大,是以指令流水線的實作會比較困難。而RSIC當中由于所有的指令幾乎都可以在一個周期内完成,是以可以很友善地實作指令流水線。而實作指令流水線之後可以讓CPU整體的效率實作質的飛躍,是以RSIC當中指令流水線都是必須實作的
什麼叫指令流水線/控制方式,什麼叫微程式控制/組合邏輯控制?這些術語背後有什麼含義?這是下一章要探讨的問題,這裡隻需做一個簡化的了解

繼續閱讀