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

微機(jī)原理與匯編語(yǔ)言程序設(shè)計(jì)課件

計(jì)算機(jī)組成原理與匯編語(yǔ)言習(xí)題一
計(jì)算機(jī)基礎(chǔ)知識(shí)介紹
《微機(jī)原理與匯編語(yǔ)言》微機(jī)基礎(chǔ)知識(shí)
計(jì)算機(jī)學(xué)習(xí)教程之指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)課件免費(fèi)下載
計(jì)算機(jī)的機(jī)器語(yǔ)言和匯編語(yǔ)言與高級(jí)語(yǔ)言的詳細(xì)資料介紹
[從零學(xué)習(xí)匯編語(yǔ)言] - 計(jì)算機(jī)中的硬件與軟件
![[從零學(xué)習(xí)<b class='flag-5'>匯編語(yǔ)言</b>] - <b class='flag-5'>計(jì)算機(jī)</b>中的硬件與軟件](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
構(gòu)建 4 位計(jì)算機(jī):匯編語(yǔ)言和匯編器(第 2 部分)

構(gòu)建 4 位計(jì)算機(jī):匯編語(yǔ)言和匯編器(第 1 部分)

計(jì)算機(jī)基礎(chǔ)知識(shí)之匯編語(yǔ)言2

評(píng)論