C66x指令集(一)——指令集架構初探索

潤星曉曄發表於2018-09-22

最近面試的時候被問到指令集,一頭霧水,由於之前的工作沒有涉及到指令集方面的知識,現總結成文。

定義

指令集架構(英語:Instruction Set Architecture,縮寫為ISA),又稱指令集或指令集體系,是計算機體系結構中與程式設計有關的部分,包含了基本資料型別指令集暫存器定址模式儲存體系中斷異常處理以及外部I/O。指令集架構包含一系列的opcode即操作碼(機器語言),以及由特定處理器執行的基本命令。(wiki定義

關於指令集的工作方式,知乎上有一個回答我覺得還可以,這裡引用一下:
CPU的指令集存放在哪裡?
其內容如下:

比如我們設計一套指令集,其中肯定有條加法指令。比如Add R1 R2 。我們可以認為這條指令的意思是計算暫存器R1中的內容和R2的和,然後把結果存到R1暫存器中。
那麼經過編譯後這條指令會變成二進位制,比如010100010010 。這條二進位制指令一共12位。明顯可以分為三大部分。最前面的0101表示這是條加法指令,後面0001說的是第一個運算元是暫存器1,最後0010說的是第二個數就是暫存器2(其實實際沒有這麼簡單的指令,至少應該區分運算元是暫存器還是直接的資料,但為了把這說的更容易理解作了簡化)。我們可以通過十二根導線把這條指令輸入一個CPU中。導線通電就是1,不通電就是0 。為了敘述方便我們從左到右用A0-A11給這12根導線編上號。
然後計算機會分析這條指令。步驟如下:
最開始的兩根導線A0和A1,第一根有電第二根沒電,就能知道這是一條運算指令(而非儲存器操作或者跳轉等指令)。那麼指令將被送入邏輯運算單元(ALU)去進行計算。其實很簡單。只要這兩根線控制接下來那部分電路開關即可。
接下來的A2和A3,01表示加法,那麼就走加法運算那部分電路,關閉減法等運算電路。
A4-A7將被送入暫存器電路,從中讀取暫存器儲存的值。送到ALU的第一個資料介面電路上。
後面的A8-A11同樣被送入暫存器選擇電路,接通R2暫存器,然後R2就把值送出來,放到ALU的第二個資料介面上。
ALU開始運算,把兩個介面電路上的資料加起來,然後輸出。
最後結果又被送回R1。
基本上簡單的運算計算機就是這麼操作的。他其實不知道你那些指令都是什麼意思。具體的指令程式設計機器碼後就會變成數位電路的開關訊號。其中某幾段會作為控制訊號,控制其他部分的資料走不同的電路以執行運算。他沒有一個地方儲存著如何翻譯這些機器碼的字典,所有機器碼的意義都被體現在整個電路的設計中了。
當然,從彙編到機器碼這步是彙編程式翻譯的。彙編程式當然知道某條指令要翻譯成什麼樣的機器碼。

所以指令集的目的就是為了實現底層操作,為每一種運算,每一種操作(如資料移動)提供相應的暫存器級別的動作,這些暫存器再和最底層的邏輯電路對應,最終完成頂層類似於"int a = 0; a = 1 + 2"的功能。

Reference:
[1] Wiki:指令集架構
[2] 知乎——CPU的指令集放在哪裡?

相關文章