匯編語言教程文件后綴大小寫S區(qū)別分析詳解
一、大小寫后綴的區(qū)別
.s 匯編語言源程序;匯編
.S 匯編語言源程序;預處理,匯編
小寫的s文件,在后期階段不在進行預處理操作,所以我們不能在這里面寫預處理的語句在里面
大寫的S文件,還會進行預處理、匯編等操作,所以我們可以在這里面加入預處理的命令
二、編譯的相關(guān)流程
預處理(Pre-Processing)-->編譯(Compiling)-->匯編(Assembling)-->鏈接(Linking)
1、預處理器
根據(jù)以字符#開頭的命令(directives),修改原始的C程序。
這個階段并不會去檢查代碼的錯誤,只會把#的語句轉(zhuǎn)成C代碼。
2、編譯階段
在這個階段中,Gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,Gcc把代碼翻譯成匯編語言。用戶可以使用”-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。匯編語言是非常有用的,它為不同高級語言不同編譯器提供了通用的語言。如:C編譯器和Fortran編譯器產(chǎn)生的輸出文件用的都是一樣的匯編語言。
3、匯編階段
匯編階段是把編譯階段生成的”.s”文件轉(zhuǎn)成目標文件,讀者在此可使用選項”-c”就可看到匯編代碼已轉(zhuǎn)化為”.o”的二進制目標代碼了。
4、鏈接階段
將庫函數(shù)(頭文件中用到的)等鏈接到目標文件中。
在成功編譯之后,就進入了鏈接階段。在這里涉及到一個重要的概念:函數(shù)庫
"stdio.h"中也只有該函數(shù)的聲明,而沒有定義函數(shù)的實現(xiàn),那么,是在哪里實現(xiàn)”printf”這些庫函數(shù)的呢?最后的答案是:系統(tǒng)把這些函數(shù)實現(xiàn)都被做到名為libc.so.6的庫文件中去了,在沒有特別指定時,gcc會到系統(tǒng)默認的搜索路徑”/usr/lib”下進行查找,也就是鏈接到libc.so.6庫函數(shù)中去,這樣就能實現(xiàn)函數(shù)”printf” 了,而這也就是鏈接的作用。
函數(shù)庫一般分為靜態(tài)庫和動態(tài)庫兩種。靜態(tài)庫是指編譯鏈接時,把庫文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為”.a”。動態(tài)庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時由運行時鏈接文件加載庫,這樣可以節(jié)省系統(tǒng)的開銷。動態(tài)庫一般后綴名為”.so”,如前面所述的libc.so.6就是動態(tài)庫。gcc在編譯時默認使用動態(tài)庫。
完成了鏈接之后,gcc就可以生成可執(zhí)行文件。
以上就是匯編文件后綴.s與.S區(qū)別分析詳解的詳細內(nèi)容,更多關(guān)于匯編文件后綴.s與.S的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析ELF轉(zhuǎn)二進制允許把 Binary 文件加載到任意位置
本文通過 eip + 偏移地址 實現(xiàn)了運行時計算數(shù)據(jù)地址,不再需要把 Binary 文件裝載到固定的位置。本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2020-02-02詳解匯編語言中中括號[]作用及l(fā)ea和mov指令的區(qū)別
這篇文章主要介紹了匯編語言中中括號[]作用及l(fā)ea和mov指令的區(qū)別,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01UEFI開發(fā)實戰(zhàn)SlimBootloader中調(diào)用FSP
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)SlimBootloader中調(diào)用FSP基礎教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06從匯編代碼開始全面解析synchronized還原最真實的偏向鎖
這篇文章主要為大家介紹了從模板解釋器匯編源碼開始分析還原最真實的偏向鎖實現(xiàn),解釋monitorenter字節(jié)碼命令的方法開始,從匯編代碼開始全面解析synchronized2022-02-02