有兩套匯編的語法:linux
ARM公司的標準ARM彙編語言和GNU對ARM支持的GNU ARM彙編。函數
ARM標準彙編語言即ARM公司的開發工具ADS裏用的彙編語言;工具
GNU彙編即在Linux下用GCC編譯的彙編。開發工具
二者語法有少量差別。所以,一般咱們下載的LINUX下的ARM接口代碼放到ADS下是不能編譯經過的,須要進行少量修改。spa
GNU AS語法即AT&T彙編語法,uboot用到的語法。.net
一。大小寫後綴的區別:翻譯
.s: 彙編語言源程序;彙編接口
.S:彙編語言源程序;預處理,彙編開發
小寫的s文件,在後期階段不在進行預處理操做,因此咱們不能在這裏面寫預處理的語句在裏面get
大寫的S文件,還會進行預處理、彙編等操做,因此咱們能夠在這裏面加入預處理的命令
二.編譯的相關流程:
預處理(Pre-Processing)-->編譯(Compiling)-->彙編(Assembling)-->連接(Linking)
1.預處理器:
根據以字符#開頭的命令(directives),修改原始的C程序
這個階段並不會去檢查代碼的錯誤,只會把#的語句轉成C代碼
[gan@localhost gcc]# gcc E hello.c o hello.i
二、編譯階段
在這個階段中,Gcc首先要檢查代碼的規範性、是否有語法錯誤等,以肯定代碼的實際要作的工做,在檢查無誤後,Gcc把代碼翻譯成彙編語言。用戶可使用」-S」選項來進行查看,該選項只進行編譯而不進行彙編,生成彙編代碼。彙編語言是很是有用的,它爲不一樣高級語言不一樣編譯器提供了通用的語言。如:C編譯器和Fortran編譯器產生的輸出文件用的都是同樣的彙編語言。
[gan@localhost gcc]# gcc S hello.i o hello.s
3.彙編階段
彙編階段是把編譯階段生成的」.s」文件轉成目標文件,讀者在此可以使用選項」-c」就可看到彙編代碼已轉化爲」.o」的二進制目標代碼了。以下所示:
[gan@localhost gcc]# gcc c hello.s(小寫s) o hello.o
4.連接階段
將庫函數(頭文件中用到的)等連接到目標文件中
在成功編譯以後,就進入了連接階段。在這裏涉及到一個重要的概念:函數庫
"stdio.h"中也只有該函數的聲明,而沒有定義函數的實現,那麼,是在哪裏實現」printf」這些庫函數的呢?最後的答案是:系統把這些函數實現都被作到名爲libc.so.6的庫文件中去了,在沒有特別指定時,gcc會到系統默認的搜索路徑」/usr/lib」下進行查找,也就是連接到libc.so.6庫函數中去,這樣就能實現函數」printf」 了,而這也就是連接的做用。
函數庫通常分爲靜態庫和動態庫兩種。靜態庫是指編譯連接時,把庫文件的代碼所有加入到可執行文件中,所以生成的文件比較大,但在運行時也就再也不須要庫文件了。其後綴名通常爲」.a」。動態庫與之相反,在編譯連接時並無把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時連接文件加載庫,這樣能夠節省系統的開銷。動態庫通常後綴名爲」.so」,如前面所述的libc.so.6就是動態庫。gcc在編譯時默認使用動態庫。
完成了連接以後,gcc就能夠生成可執行文件
[gan@localhost gcc]# gcc hello.o o hello