機器程式碼
機器程式碼是特定本機資料格式的術語,由機器直接處理 - 通常由稱為 CPU (中央處理單元) 的處理器處理。
通用計算機體系結構( 馮諾依曼體系結構 )由通用處理器(CPU),通用儲存器組成 - 儲存程式(ROM / RAM)和處理資料以及輸入和輸出裝置(I / O 裝置)。
這種架構的主要優點是每個元件的相對簡單性和通用性 - 與之前的計算機機器(機器結構中的硬連執行緒序)或競爭架構(例如哈佛架構將程式儲存器與儲存器的記憶體分開)相比資料)。缺點是總體效能稍差。從長遠來看,普遍性允許靈活使用,這通常超過了效能成本。
這與機器程式碼有什麼關係?
程式和資料作為數字儲存在這些計算機中的記憶體中。沒有真正的方法來區分資料程式碼,因此作業系統和機器運算子在將所有數字載入到記憶體後給出 CPU 提示,在該提示處,記憶體的入口點啟動程式。然後 CPU 讀取儲存在入口點的指令(數字),並嚴格處理,順序讀取下一個數字作為進一步的指令,除非程式本身告訴 CPU 繼續在別處執行。
例如,兩個 8 位數字(8 位組合在一起等於 1 個位元組,這是 0-255 範圍內的無符號整數):60
201
,當作為 Zilog Z80 CPU 上的程式碼執行時,將作為兩個指令處理:INC a
(暫存器 a
中的值遞增一個)和 RET
(從子程式返回,指向 CPU 執行來自儲存器不同部分的指令)。
為了定義該程式,人類可以通過某些儲存器/檔案編輯器輸入這些數字,例如在十六進位制編輯器中輸入兩個位元組:3C C9
(以 16 進位制編碼寫入的十進位制數 60 和 201)。那將是機器程式碼*程式設計 ***** 。
為了使人類更容易編寫 CPU 程式設計任務,建立了一個 Assembler 程式,能夠讀取包含以下內容的文字檔案:
subroutineIncrementA:
INC a
RET
dataValueDefinedInAssemblerSource:
DB 60 ; define byte with value 60 right after the ret
輸出位元組十六進位制數字序列 3C C9 3C
,包含特定於目標平臺的可選附加數字:標記此類二進位制檔案的哪一部分是可執行程式碼,其中是程式的入口點(其中的第一條指令),哪些部分是編碼資料(不可執行)等
注意程式設計師如何將值為 60 的最後一個位元組指定為資料,但從 CPU 的角度來看,它與 INC a
位元組沒有任何區別。由執行程式正確導航 CPU 作為指令準備的位元組,並僅將資料位元組作為指令資料處理。
這樣的輸出通常儲存在儲存裝置上的檔案中,稍後由 OS( 作業系統 - 已經在計算機上執行的機器程式碼,有助於與計算機一起操作 )在執行之前載入到記憶體中,最後將 CPU 指向程式的切入點。
CPU 只能處理和執行機器程式碼 - 但是任何記憶體內容,甚至是隨機記憶體,都可以這樣處理,雖然結果可能是隨機的,從 OS 檢測和處理的 崩潰到意外擦除 I /中的資料 O 裝置,或連線到計算機的敏感裝置的損壞(不是家用電腦的常見情況:))。
許多其他高階程式語言遵循類似的過程,將源 (人類可讀的文字形式的程式) 編譯成數字,或者代表機器程式碼(CPU 的本機指令),或者在解釋/混合語言的情況下編譯成一般的特定於語言的虛擬機器程式碼,在直譯器或虛擬機器執行期間進一步解碼為本機機器程式碼。
有些編譯器使用 Assembler 作為編譯的中間階段,首先將源轉換為 Assembler 形式,然後執行彙編工具從中獲取最終的機器程式碼 (GCC 示例:執行 gcc -S helloworld.c
以獲得 C 程式的彙編版本 helloworld.c
)。