開啟彙編之門

2021-04-07 02:12:14 字數 2184 閱讀 9752

2、初窺彙編

下面是乙個簡單的c函式:

void dummy()

我們使用gcc加-s選項將之轉換成彙編**如下(省略部分內容):

movl $1234, -4(%ebp)

movl -4(%ebp), %eax

movl %eax, -8(%ebp)

看 了一眼又一眼,還是看不懂,只是發現些熟悉的內容,因為上面提過如%ebp、%eax等。這只是個引子,讓我們感性的認識一下彙編的「容貌」。我們一點點 地來看。咋看一眼彙編**長得似乎很相似,沒錯,彙編**就是一條一條的「指令+運算元」的語句的集合。彙編指令是固定的,每條指令都有其固定的用途,而 運算元表示則有多種型別。

1) 運算元表示

大部分彙編指令都有乙個或多個運算元,包括指令操作中的源和目的。一條標準的指令格式大 致是這樣的:「指令 + 源運算元 + 目的運算元」,其中源運算元可以是立即數、從暫存器中讀出的數或從記憶體中讀出的數;而目的運算元則可以是暫存器或記憶體。按這麼一分類,運算元就大致有三 種:

a) 立即數表示法 -- 如「movl $1234, -4(%ebp)」中的「$1234」,就是乙個立即數作為運算元,按照gnu彙編語法,立即數表示為「$+整數」。立即數常用來表示**中的一些常數, 如上例中的「$1234」。注意一點的是立即數不能作為目的運算元。

b) 暫存器表示法 -- 這種比較簡單,它就是表示暫存器之內容。如上面的「movl -4(%ebp), %eax」中的%eax就是使用暫存器表示法作源運算元,而「movl %eax, -8(%ebp)」中的%eax則是使用暫存器表示法作目的運算元。

c) 記憶體引用表示法 -- 計算出的該運算元的值表示的是相應的記憶體位址。彙編指令根據這個記憶體位址訪問相應的記憶體位置。如上例「movl -4(%ebp), %eax」中的「-4(%ebp)」,其表示的記憶體位址為(%ebp暫存器中的內容-4)得到的值。

2) 資料傳送指令

組合語言中最最常用的指令 -- 資料傳送指令,也是我們接觸的第一種類別的彙編指令。其指令的格式為:「mov 源運算元, 目的運算元」。

mov 系列支援從最小乙個位元組到最大雙字的訪問與傳送。其中movb用來傳送一位元組資訊,movw用來傳送二位元組,即乙個字的資訊,movl用來傳送雙字資訊。 這些不詳說了。除此以外mov系列還提供兩個帶位擴充套件的指令movsbl和movzbl,我們舉個例子來說明一下這兩個特殊指令的作用何在:

a) movzbl指令

void dummy1()

其對應的gnu彙編為(省略部分內容):

movb $97, -1(%ebp)   //'a'的ascii碼為97

movzbl -1(%ebp), %eax

movl %eax, -8(%ebp)

說 明:在dummy1函式中「unsigned int a = c」語句完成的是乙個從unsigned char到unsigned int的賦值操作,由於int的型別長度大於char型別長度,所以實際是將乙個位元組的內容拷貝到乙個可以容納4個位元組的地方,這樣的話需要對源資料進行 一下擴充套件,即填充高位的3個位元組。

如何填充呢?由於變數a和c都為無符號整型,所以只需要填充0即可。而movzbl就是幹這個活的。movzbl指令負責拷貝乙個位元組,並用0填充其目的運算元中的其餘各位,這種擴充套件方式叫「零擴充套件」。

b) movsbl指令

void dummy2()

其對應的gnu彙編為(省略部分內容):

movb $97, -1(%ebp)   //'a'的ascii碼為97

movsbl -1(%ebp), %eax

movl %eax, -8(%ebp)

說 明:在dummy2函式中「unsigned int a = c」語句完成的是乙個從signed char到unsigned int的賦值操作,由於int的型別長度大於char型別長度,所以實際是將乙個位元組的內容拷貝到乙個可以容納4個位元組的地方,這樣的話需要對源資料進行 一下擴充套件,即填充高位的3個位元組。如何填充呢?gnu彙編告訴我們它使用了變數c的最高位來填充其餘的3個位元組。movsbl指令負責拷貝乙個位元組,並用 源運算元的最高位填充其目的運算元中的其餘各位,這種擴充套件方式叫「符號擴充套件」。實際上dummy2中變數a還是保留了變數c的符號位的,起碼gcc是這麼 做的。

3、小結

已經邁出了踏入彙編之門的第一步,彙編的確讓我眼前敞亮了許多,看得多了,知道得多了,疑惑也就少了。

4、參考資料

1) 《computer systems a programmer's perspective》

開啟智慧型之門

秋高氣爽,很舒適。桌上的綠葉在隨風招展,像淘氣的小孩在跳著混亂的舞蹈。每天,到了四點多的時候,都會有乙個小男孩兒,揹著個小書包,嘰裡呱啦的從旁邊經過。這孩子的爹媽就在這裡。作為一觀察著,我很是好奇。小孩兒奔奔跳跳,自己幻想著各種各樣的有戲和夥伴,一會兒奔跑,一會兒蹲下,一會兒靜悄悄,一會兒大叫 快,...

如何開啟軟體從業之門?

微軟patterns practices團隊的首席專案經理j.d.meier近日在其部落格發表了文章effectiveness post roundup 為那些渴望提公升自己的新兵提出了中懇的建議。同時,還給出了相關的資源作為參考和指導。他認為,從事軟體開發之難有如逆水行舟。開發人員 應該合理運用自...

如何開啟軟體從業之門?

微軟patterns practices團隊的首席專案經理j.d.meier近日在其部落格發表了文章effectiveness post roundup,為那些渴望提公升自己的新兵提出了中懇的建議。同時,還給出了相關的資源作為參考和指導。他認為,從事軟體開發之難有如逆水行舟。開發人員 應該合理運用自...