機器碼、CPU指令集還有彙編程式設計是面對機器最底層的三個層次。 基本的思路是按高階語言編寫的程式由編譯器或解譯器翻譯成組合語言代碼, 然後再由彙編器翻譯成機器碼。
彙編程式設計實際上最終面對的是機器碼, 那麼為什麼要涉及指令集這個玩意呢。 在電腦中, 簡單或複雜的功能模組都是由邏輯門搭建而成的。 這些功能模組的具體功能通過指令集來表示, 至於CPU具體有哪些功能, 具體包含哪些模組, CPU設計者會設計出具體的指令集, 並通過功能模組搭建而成。 因為指令集它不是數位序列,
CPU指令集(ISA, Instruction Set Architecture)是描述CPU能實現什麼功能的一個集合, 就是描述"CPU能使用哪些機器碼"的集合"。 是人們對CPU功能的一種低層次的抽象, 和CPU運作中使用的數位序列“幾乎”存在一種對應關係。
只有CPU指令集範圍內的指令可以被成功的解碼, 並送往CPU流水線後端去執行。 程式師在程式設計時並不需要瞭解晶片的佈局, 只需要知道根據那些指令能完成怎樣的功能就行了(這些指令由CPU具體執行)。
(彙編--> 機器碼 的這種“翻譯規則”) + (CPU執行機器碼的邏輯電路) = 指令集。
所以可以這樣理解,
當我們開始起名字的時候, 數位就不單純是數位了, 所以我說指令集是一種抽象是一種理想。
我們在說彙編指令的時候提到CPU需要的是數位序列也就是機器碼, 這個轉換過程叫彙編, 可以理解為“匯總、編輯”, 匯總之前實際還涉及一些替換以及四則運算。 匯總的意思是, 我們編寫的這些CPU機器碼的文字性表示也許分散在幾個不同的地方, 所以我們需要匯總起來。 編輯的意思是, 我們會在彙編指令之間(又或者是末尾或開頭)插入一些標記,
那麼我們為這個轉換, 也就說彙編, 編寫的工具叫做彙編器。 彙編器的作者, 他也不想只對著一堆數位思考。 他參照指令集來考慮, 實現這樣一套工具。 有了彙編器, 我們就可以做彙編程式設計了, 當然是照著這個彙編器的規則來程式設計。
那麼, 重點來了, 為什麼高階語言編譯器要把原始程式碼轉成彙編指令呢。 對於編譯器作者有很多個理由可以這麼做:
他也不想對著數字思考, 反正彙編器作者已經受了一次罪了他就可以輕鬆了;
有幾個機器碼形式不同的CPU需要他的編譯器支援,
只有一個CPU需要支援, 但他怕領導未來讓他支持其他CPU, 所以先留點後路;
他很同情他未來的同事, 想著如果未來同事要支援不同的CPU, 可以按照他的工作結果改, 能輕鬆一些;
對於CPU指令集, 其中肯定有條加法指令。 比如Add R1 R2 。 我們可以認為這條指令的意思是計算寄存器R1中的內容和R2的和, 然後把結果存到R1寄存器中。
那麼經過編譯後這條指令會變成二進位, 比如010100010010 。 這條二進位指令一共12位元。 明顯可以分為三大部分。 最前面的0101表示這是條加法指令, 後面0001說的是第一個運算元是寄存器1, 最後0010說的是第二個數就是寄存器2(其實實際沒有這麼簡單的指令, 至少應該區分運算元是寄存器還是直接的資料,
然後電腦會分析這條指令。 步驟如下:
1 最開始的兩根導線A0和A1, 第一根有電第二根沒電, 就能知道這是一條運算指令(而非記憶體操作或者跳轉等指令)。 那麼指令將被送入邏輯運算單元(ALU)去進行計算。 其實很簡單。 只要這兩根線控制接下來那部分電路開關即可。
2 接下來的A2和A3, 01表示加法, 那麼就走加法運算那部分電路, 關閉減法等運算電路。
3 A4-A7將被送入寄存器電路, 從中讀取寄存器保存的值。 送到ALU的第一個資料介面電路上。
4 後面的A8-A11同樣被送入寄存器選擇電路, 接通R2寄存器,然後R2就把值送出來,放到ALU的第二個資料介面上。
5 ALU開始運算,把兩個介面電路上的資料加起來,然後輸出。
6 最後結果又被送回R1。
基本上簡單的運算電腦就是這麼操作的。他其實不知道你那些指令都是什麼意思。具體的指令程式設計機器碼後就會變成數位電路的開關信號。其中某幾段會作為控制信號,控制其他部分的資料走不同的電路以執行運算。他沒有一個地方保存著如何翻譯這些機器碼的字典,所有機器碼的意義都被體現在整個電路的設計中了。
按馮 · 諾依曼存儲程式結構體系的思路,一個程式的全部機器碼全部保存在記憶體中(程式指令與資料結構分區保存),記憶體可以隨機訪問。在CPU中,由控制器的PC計數器控制順序從記憶體中讀取指令或資料,由控制器對指令進行解碼,產生相應的控制信號由控制電路控制CPU的運算部件和寄存器進行運算和存取操作,直至全部代碼執行完成。
接通R2寄存器,然後R2就把值送出來,放到ALU的第二個資料介面上。5 ALU開始運算,把兩個介面電路上的資料加起來,然後輸出。
6 最後結果又被送回R1。
基本上簡單的運算電腦就是這麼操作的。他其實不知道你那些指令都是什麼意思。具體的指令程式設計機器碼後就會變成數位電路的開關信號。其中某幾段會作為控制信號,控制其他部分的資料走不同的電路以執行運算。他沒有一個地方保存著如何翻譯這些機器碼的字典,所有機器碼的意義都被體現在整個電路的設計中了。
按馮 · 諾依曼存儲程式結構體系的思路,一個程式的全部機器碼全部保存在記憶體中(程式指令與資料結構分區保存),記憶體可以隨機訪問。在CPU中,由控制器的PC計數器控制順序從記憶體中讀取指令或資料,由控制器對指令進行解碼,產生相應的控制信號由控制電路控制CPU的運算部件和寄存器進行運算和存取操作,直至全部代碼執行完成。