- 和其他語言不一樣,彙編語言沒有統一的編譯器,彙編語言的格式隨着編譯的不同而不同,因此瞭解什麼是彙編語言是學習彙編語言的第一道門檻。
- 首先,我們需要知道彙編語言爲什麼出現,爲了回答這個問題,我們就不得不聊一聊處理器指令。
處理器指令:
在計算機內部,處理器基於芯片製造商內置於芯片內的二進制代碼來處理數據,這些代碼定義了處理器操作數據的行爲。這些代碼通常被叫做指令編碼,不同的處理器,指令編碼也一般不一樣。
指令編碼:
處理器通過不斷讀取內存中的指令編碼來運行,指令編碼包含一個或多個字節的數據用來完成不同的任務,指令編碼用到的數據也被處理器讀取到內存,本質上指令編碼和相關的數據對處理器來說沒有什麼不同。
爲了區分指令編碼和數據,我們用指針來區分,指令指針指向要操作的對象,數據指針指向相關的數據。
指令指針總是指向當前要執行的指令。
數據指針用來標識當前內存中程序數據開始的地方,這個區域也稱爲棧。
指令編碼的格式:
這裏我們以當前使用比較廣泛的IA-32指令編碼來說明,指令編碼主要包含4個部分:
-
指令前綴(可選)
-
操作碼
-
修飾符(可選)
-
數據 (可選)
操作碼:
從上面可以看出指令編碼中唯一必須的元素就是操作碼,他的主要功能是用來完成不同的任務。
指令前綴:
指令前綴的主要功能是修飾操作碼,按功能主要分爲4種類型:
鎖和重複前綴
段重載和分支預測前綴
操作數size重載前綴
地址size重載前綴
修飾符:
一些操作碼需要額外的修飾符來指定寄存器或內存的位置
數據:
操作碼操作的對象
彙編語言:
彙編語言主要包括3部分:
- 助記符
- 數據區
- 指令
助記符
彙編語言定義的運算符號
數據區
彙編語言主要使用兩種方式來定義數據:
- 內存中
- 棧中
棧這種定義數據的方式比較簡單,主要通過運算符直接操作
內存定義的方法主要包含兩個部分:
- 標籤
- 數據類型
testvalue:
.long 150
message:
.ascii "this is a test message"
pi:
.float 3.14159
指令
最終要的指令是 .section 被用來定義段,彙編語言中最重要的3個段:
- 數據段
- 堆棧段
- 文本段