Linux 中的組合語言(二)

來源:互聯網
上載者:User
2 AT&T組合語言的相關知識

在Linux原始碼中,以.S為副檔名的檔案是“純”組合語言的檔案。這裡,我們結合

具體的例子再介紹一些AT&T組合語言的相關知識。

 

1.GNU組譯工具GAS(GNU Assembly和串連程式)

 

當你編寫了一個程式後,就需要對其進行彙編(assembly)和串連。在Linux下有兩種方式,一種是使用組譯工具GAS和串連程式ld,一種是使用gcc。我們先來看一下GAS和ld:

 

GAS把組合語言源檔案(.o)轉換為目標檔案(.o),其基本文法如下:

as filename.s -o filename.o

 

一旦建立了一個目標檔案,就需要把它串連並執行,串連一個目標檔案的基本文法為:

ld filename.o -o filename

 

這裡 filename.o是目標檔案名,而filename 是輸出(可執行) 檔案。

 

GAS使用的是AT&T的文法而不是Intel的文法,這就再次說明了AT&T文法是Unix世界的標準,你必須熟悉它。

 

如果要使用GNC的C編譯器gcc,就可以一步完成彙編和串連,例如:

gcc -o example example.S

 

這裡,example.S是你的組譯工具,輸出檔案(可執行檔)名為example。其中,副檔名必須為大寫的S,這是因為,大寫的S可以使gcc自動識別組譯工具中的C預先處理命令,像#include、#define、#ifdef、 #endif等,也就是說,使用gcc進行編譯,你可以在組譯工具中使用C的預先處理命令。

 

2. AT&T中的段(Section)

 

在AT&T的文法中,一個段由.section關鍵詞來標識,當你編寫組合語言程式時,至少需要有以下三個段:

 

(1)資料區段

 

.section .data: 這種節包含程式已初始化的資料,也就是說,包含具有初值的那些變數,例如:

hello : .string "Hello world!/n"

hello_len : .long 13

 

(2)BSS段

 

.section .bss:這個節包含程式還未初始化的資料,也就是說,包含沒有初值的那些變數。當作業系統裝入這個程式時將把這些變數都置為0,例如:

name : .fill 30 # 用來請求使用者輸入名字

name_len : .long 0 # 名字的長度 (尚未定義)

 

當這個程式被裝入時,name 和 name_len都被置為0。如果你在.bss節不小心給一個變數賦了初值,這個值也會丟失,並且變數的值仍為0。

 

使用.bss比使用.data的優勢在於,.bss節不佔用磁碟的空間。在磁碟上,一個長整數就足以存放.bss節。當程式被裝入到記憶體時,作業系統也只分配給這個節4個位元組的記憶體大小。

 

注意:編譯器把.data和.bss在4位元組上對齊(align),例如,.data總共有34位元組,那麼編譯器把它對其在36位元組上,也就是說,實際給它36位元組的空間。

 

(3)程式碼片段

 

.section .text :這個節包含程式的代碼,它是唯讀節,而.data 和.bss是讀/寫節。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.