CPU的硬件結構和彙編語言

知乎用戶、朱超然譚厶 等人贊同
是,這個解釋起來有點長。Be patient
現代的CPU沒拆過,我只在計算機組成原理實驗課上用VHDL在某個實驗平臺上作過一個模擬的CPU。舉個例子你可能比較好理解。
好比咱們設計一套指令集,其中確定有條加法指令。好比Add R1 R2 。咱們能夠認爲這條指令的意思是計算寄存器R1中的內容和R2的和,而後把結果存到R1寄存器中。
那麼通過編譯後這條指令會變成二進制,好比010100010010 。這條二進制指令一共12位。明顯能夠分爲三大部分。最前面的0101表示這是條加法指令,後面0001說的是第一個操做數是寄存器1,最後0010說的是第二個數就是寄存器2(其實實際沒有這麼簡單的指令,至少應該區分操做數是寄存器仍是直接的數據,但爲了把這說的更容易理解做了簡化)。咱們能夠經過十二根導線把這條指令輸入一個CPU中。導線通電就是1,不通電就是0 。爲了敘述方便咱們從左到右用A0-A11給這12根導線編上號。
而後計算機會分析這條指令。步驟以下:
  1. 最開始的兩根導線A0和A1,第一根有電第二根沒電,就能知道這是一條運算指令(而非存儲器操做或者跳轉等指令)。那麼指令將被送入邏輯運算單元(ALU)去進行計算。其實很簡單。只要這兩根線控制接下來那部分電路開關便可。
  2. 接下來的A2和A3,01表示加法,那麼就走加法運算那部分電路,關閉減法等運算電路。
  3. A4-A7將被送入寄存器電路,從中讀取寄存器保存的值。送到ALU的第一個數據接口電路上。
  4. 後面的A8-A11一樣被送入寄存器選擇電路,接通R2寄存器,而後R2就把值送出來,放到ALU的第二個數據接口上。
  5. ALU開始運算,把兩個接口電路上的數據加起來,而後輸出。
  6. 最後結果又被送回R1。
基本上簡單的運算計算機就是這麼操做的。他其實不知道你那些指令都是什麼意思。具體的指令編程機器碼後就會變成數字電路的開關信號。其中某幾段會做爲控制信號,控制其餘部分的數據走不一樣的電路以執行運算。他沒有一個地方保存着如何翻譯這些機器碼的字典,全部機器碼的意義都被體如今整個電路的設計中了。
固然,從彙編到機器碼這步是彙編程序翻譯的。彙編程序固然知道某條指令要翻譯成什麼樣的機器碼。

 
 
評分最高的(@Cascade )回答的應該是指令是如何執行的,對題主提的指令集存在CPU哪裏,個人回答是:1. 指令集是在設計CPU時規定的,指令集規定了有哪些CPU可以「一條條」執行的「指令」是合法的。2. 指令集是一個集合,它的功能性體如今每條可以執行的「指令」上面。涉及到具體指令後,就涉及到誰是「操做對象」,和「如何找到操做對象」,「對操做對象進行什麼操做」,這些問題上來。3. 指令的功能是經過CPU中功能邏輯電路來實現的,以前的「指令設計」決定了如何進行「邏輯電路設計」。而相同的指令能夠採起不一樣的邏輯電路設計。4. 由於「指令集」自己沒有功能性,因此在CPU中你不能找到「指令集」這個實體,可是指令集中的指令與CPU的內部晶體管組成的邏輯電路是等價的(除了指令部分還有中斷,外設等這些暫不考慮),那麼非要化等價的話,就是實現指令集中各指令的總體晶體管邏輯電路。5. 若是你非要在沒給出指令集的CPU來找到它的指令集的話,你能夠經過修改PC指向的下一條指令的內容,並觀察內存及各寄存器的變化,來試探每條指令編碼的功能(這顯然沒有什麼實際價值)(你能夠用這種方法去理解指令的功能)。
相關文章
相關標籤/搜索