匯編語言和本地代碼是一一對應的
在前面的文章中我們多次提到,計算機CPU
能直接解釋運行的只有 「本地代碼」 (機器語言)程序。用C語言
等編寫的源代碼,需要通過各自的 「編譯器」 編譯后,轉換成本地代碼。
通過調用本地代碼的內容,可以了解程序最終是以何種形式來運行的。但是,直接打開本地代碼來看,只能看到數值的羅列。
我們可以采用另外一種方式,在各本地代碼中,附帶上表示其功能的英語單詞縮寫。例如,在加法運算的本地代碼中加上add
、在比較運算的本地代碼中加上cmp
等。這些縮寫被稱為 「助記符」 ,使用助記符的編程語言稱為**「匯編語言」**
不過, 「即使是用匯編語言編寫的源代碼,最終也必須要轉換成本地代碼才能運行」 。負責準換工作的程序稱為 「匯編器」 ,轉換這個一處理本身稱為 「匯編」 。
?用匯編語言編寫的源代碼,和本地代碼是一一對應的
?
本地代碼也可以反過來轉換成匯編語言的源代碼。持有該功能的 「逆變換」 程序稱為 「反匯編程序」 ,逆變換這一處理本身稱為 「反匯編」 。
不會轉換成本地代碼的偽指令
匯編語言的源代碼,是由轉換本地代碼的指令和針對匯編器的 「偽指令」 構成的。 「偽指令負責把程序的構造及匯編的方法指示給匯編器(轉換程序)」 。不過,偽指令是無法匯編轉換成本地代碼。
如上是一個匯編代碼片段。其中 「彩色」 部分是偽指令。
由偽指令segment
和ends
圍起來的部分,是給構成程序的命令和數據的集合體加上一個名字而得到的,稱為 「段定義」 。段定義的英文表達segment
具有區域的意思。在程序中, 「段定義指的是命令和數據等程序的集合體的意思」 。
?一個程序由多個段定義構成
?
如上圖所示。源代碼的開始位置,定義了3個名稱分別為_TEXT
、_DATA
、_BSS
的段定義。
_TEXT
是指令的段定義_DATA
是被初始化(有初始值)的數據的段定義_BSS
是尚未初始化的數據的段定義
而這些段定義的名稱及劃分方法,不同的編譯器都有自己的一套規則。
偽指令proc
和endp
圍起來的部分,表示的是過程Proceduce的范圍。在匯編語言中,這種相當于C
語言的函數的形式稱為過程。
匯編語言的語法是**「操作碼 + 操作數」**
「在匯編語言中,1行表示對CPU
的一個指令」 。匯編語言指令的語法結構是 「操作碼」 + 「操作數」 。
- 「操作碼」 表示的是指令動作
- 「操作數」 表示的是指令對象
操作碼和操作數羅列在一起的語法,就是一個英文的指令文本。操作碼是動詞,操作數相當于賓語。
能夠使用何種形式的操作碼,是由CPU
的種類決定的。
常用操作碼的功能
本地代碼加載到內存后才能運行。內存中存儲著構成本地代碼的指令和數據。程序運行時,CPU
會從內存中把指令和數據讀出,然后再將存儲在CPU
內部的寄存器中進行處理。
「寄存器是CPU
中的存儲區域」 。不過,寄存器并不僅僅具有存儲指令和數據的功能,也有運算功能。寄存器的名稱會通過匯編語言的源代碼指定給操作數。內存中的存儲區域是用 「地址編號」 來區分的。CPU
內的寄存器是用eax
及ebx
這些名稱開區分的。
下圖是CPU
的寄存器的主要種類和角色
mov指令
mov
指令的兩個操作數,分別是用來指定數據的 「存儲地」 和 「讀出源」 。
操作數可以指定寄存器、常數、標簽(附近在地址前)以及用方括號([]
)圍起來的這些內容。
- 如果指定了 「沒有用方括號圍起來」 的內容,就表示對該值進行處理
- 如果指定了 「用方括號圍起來」 的內容,方括號中的值則會被解釋為 「內存地址」 ,然后就會對該內存地址對應的值進行讀寫操作
mov ebp,esp;
mov eax,dword ptr [ebp+8];
mov ebp,esp
中,esp
寄存器中的值被直接存儲在ebp
寄存器中。esp
寄存器的值是100
時ebp
寄存器的值也是100
。
而mov eax,dword ptr [ebp+8];
中,ebp
寄存器的值加8后得到的值會被解釋為內存地址。如果ebp
寄存器的值是100的話,那么eax
寄存器中存儲的就是100 + 8 = 108
地址的數據。
-
cpu
+關注
關注
68文章
10899瀏覽量
212614 -
計算機
+關注
關注
19文章
7530瀏覽量
88419 -
C語言
+關注
關注
180文章
7614瀏覽量
137397 -
編譯器
+關注
關注
1文章
1642瀏覽量
49228
發布評論請先 登錄
相關推薦
評論