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