版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式程序的編譯與調(diào)試第一頁(yè),共二十七頁(yè),2022年,8月28日3.1.1C語(yǔ)言編譯器C語(yǔ)言是在70年代初問世的。一九七八年由美國(guó)電話電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語(yǔ)言。早期的C語(yǔ)言主要是用于UNIX系統(tǒng)目前最流行的C語(yǔ)言編譯器有以下幾種:GNUCompilerCollection或稱GCCMicrosoftC或稱MSCBorlandTurboC或稱TurboC第二頁(yè),共二十七頁(yè),2022年,8月28日3.1.2C語(yǔ)言編譯過程編譯:編譯程序讀取源程序(字符流),對(duì)之進(jìn)行詞法和語(yǔ)法的分析,將高級(jí)語(yǔ)言指令轉(zhuǎn)換為功能等效的匯編代碼,再由匯編程序轉(zhuǎn)換為機(jī)器語(yǔ)言,并且按照操作系統(tǒng)對(duì)可執(zhí)行文件格式的要求鏈接生成可執(zhí)行程序。C源程序頭文件-->預(yù)編譯處理(cpp)-->編譯程序本身-->優(yōu)化程序-->匯編程序-->鏈接程序-->可執(zhí)行文件預(yù)處理編譯階段優(yōu)化階段匯編過程連接程序第三頁(yè),共二十七頁(yè),2022年,8月28日3.1.2.1編譯預(yù)處理預(yù)處理:讀取c源程序,對(duì)其中的偽指令(以#開頭的指令)和特殊符號(hào)進(jìn)行處理。偽指令主要包括以下四個(gè)方面:宏定義指令如#defineName#undef條件編譯指令如#ifdef,#ifndef,#else,#elif,#endif,頭文件包含指令如#include"FileName"或者#include<FileName>等特殊符號(hào)如LINEFILE預(yù)編譯程序所完成的基本上是對(duì)源程序的“替代”工作。經(jīng)過此種替代,生成一個(gè)沒有宏定義、沒有條件編譯指令、沒有特殊符號(hào)的輸出文件。這個(gè)文件的含義同沒有經(jīng)過預(yù)處理的源文件是相同的,但內(nèi)容有所不同。第四頁(yè),共二十七頁(yè),2022年,8月28日3.1.2.2編譯階段預(yù)編譯程序所要作得工作:詞法分析語(yǔ)法分析,翻譯成等價(jià)的中間代碼表示或匯編代碼。第五頁(yè),共二十七頁(yè),2022年,8月28日3.1.2.3優(yōu)化階段優(yōu)化處理是編譯系統(tǒng)中一項(xiàng)比較艱深的技術(shù)。它涉及到的問題不僅同編譯技術(shù)本身有關(guān),而且同機(jī)器的硬件環(huán)境也有很大的關(guān)系中間代碼的優(yōu)化不依賴于具體的計(jì)算機(jī)主要的工作是刪除公共表達(dá)式、循環(huán)優(yōu)化(代碼外提、強(qiáng)度削弱、變換循環(huán)控制條件、已知量的合并等)、復(fù)寫傳播,以及無用賦值的刪除,
目標(biāo)代碼的生成優(yōu)化依賴于具體的計(jì)算機(jī)充分利用機(jī)器的各個(gè)硬件寄存器存放的有關(guān)變量的值,以減少對(duì)于內(nèi)存的訪問次數(shù)對(duì)指令進(jìn)行一些調(diào)整使目標(biāo)代碼比較短,執(zhí)行的效率比較高經(jīng)過優(yōu)化得到的匯編代碼必須經(jīng)過匯編程序的匯編轉(zhuǎn)換成相應(yīng)的機(jī)器指令,方可能被機(jī)器執(zhí)行第六頁(yè),共二十七頁(yè),2022年,8月28日3.1.2.4匯編階段匯編過程實(shí)際上指把匯編語(yǔ)言代碼翻譯成目標(biāo)機(jī)器指令的過程目標(biāo)文件中所存放的也就是與源程序等效的目標(biāo)的機(jī)器語(yǔ)言代碼。目標(biāo)文件由段組成代碼段該段中所包含的主要是程序的指令。該段一般是可讀和可執(zhí)行的,但一般卻不可寫。數(shù)據(jù)段主要存放程序中要用到的各種全局變量或靜態(tài)的數(shù)據(jù)。一般數(shù)據(jù)段都是可讀,可寫,可執(zhí)行的。第七頁(yè),共二十七頁(yè),2022年,8月28日3.1.2.4匯編階段UNIX環(huán)境下主要有三種類型的目標(biāo)文件:可重定位文件其中包含有適合于其它目標(biāo)文件鏈接來創(chuàng)建一個(gè)可執(zhí)行的或者共享的目標(biāo)文件的代碼和數(shù)據(jù)。共享的目標(biāo)文件這種文件存放了適合于在兩種上下文里鏈接的代碼和數(shù)據(jù)。第一種事鏈接程序可把它與其它可重定位文件及共享的目標(biāo)文件一起處理來創(chuàng)建另一個(gè)目標(biāo)文件;第二種是動(dòng)態(tài)鏈接程序?qū)⑺c另一個(gè)可執(zhí)行文件及其它的共享目標(biāo)文件結(jié)合到一起,創(chuàng)建一個(gè)進(jìn)程映象??蓤?zhí)行文件它包含了一個(gè)可以被操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程來執(zhí)行之的文件。匯編程序生成的實(shí)際上是第一種類型的目標(biāo)文件。對(duì)于后兩種還需要其他的一些處理方能得到,這個(gè)就是鏈接程序的工作了。第八頁(yè),共二十七頁(yè),2022年,8月28日3.1.2.5鏈接階段鏈接程序是將有關(guān)的目標(biāo)文件彼此相連接,使得所有的這些目標(biāo)文件成為一個(gè)能夠被操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。目標(biāo)文件由段組成鏈接處理可分為兩種:靜態(tài)鏈接動(dòng)態(tài)鏈接第九頁(yè),共二十七頁(yè),2022年,8月28日3.1.3Makefilemakefile是用于自動(dòng)編譯和鏈接的makefile能夠紀(jì)錄文件的信息,決定在鏈接的時(shí)候需要重新編譯哪些文件第十頁(yè),共二十七頁(yè),2022年,8月28日3.2嵌入式C程序的編譯過程創(chuàng)建過程編譯鏈接定址第十一頁(yè),共二十七頁(yè),2022年,8月28日3.2.1創(chuàng)建過程源代碼轉(zhuǎn)換為可執(zhí)行的二進(jìn)制映像的過程源文件都被編譯或匯編到一個(gè)目標(biāo)文件(objectfile)可重定位程序(relocatableprogram)重定址(relocation)的過程第十二頁(yè),共二十七頁(yè),2022年,8月28日3.2.2編譯編譯器的工作主要是把用人可讀的語(yǔ)言所書寫的程序,翻譯為特定的處理器上等效的一系列操作碼。第十三頁(yè),共二十七頁(yè),2022年,8月28日3.2.3鏈接創(chuàng)建過程編譯鏈接定址第十四頁(yè),共二十七頁(yè),2022年,8月28日3.2.4定址創(chuàng)建過程編譯鏈接定址第十五頁(yè),共二十七頁(yè),2022年,8月28日3.3程序運(yùn)行A.out及其傳說段操作系統(tǒng)在a.out里干了什么C語(yǔ)言運(yùn)行在a.out里干了什么函數(shù)調(diào)用時(shí)發(fā)生了什么Auto和static關(guān)鍵字Unix/Linux的堆棧段MS-DOS的堆棧段第十六頁(yè),共二十七頁(yè),2022年,8月28日3.3.1A.out及其傳說A.out-----“assembleroutput(匯編程序輸出)”的縮寫形式a.out文件格式分析a.out文件包含7個(gè)section,格式如下:execheader(執(zhí)行頭部,也可理解為文件頭部)textsegment(文本段)datasegment(數(shù)據(jù)段)textrelocations(文本重定位段)datarelocations(數(shù)據(jù)重定位段)symboltable(符號(hào)表)stringtable(字符串表)a.out是早期UNIX系統(tǒng)使用的可執(zhí)行文件格式,由AT&T設(shè)計(jì),現(xiàn)在基本上已被ELF文件格式代替第十七頁(yè),共二十七頁(yè),2022年,8月28日3.3.2段段(segments):是二進(jìn)制文件中簡(jiǎn)單的區(qū)域,里面保存了和某種特定類型(如符號(hào)表?xiàng)l目)相關(guān)的所有信息段可以方便地映射到鏈接器在運(yùn)行時(shí)可以直接載入的對(duì)象中段在正在執(zhí)行的程序中是一塊內(nèi)存區(qū)域,每個(gè)區(qū)域都有特定的目的
第十八頁(yè),共二十七頁(yè),2022年,8月28日3.3.3操作系統(tǒng)在a.out里干了什么為什么a.out要以段的形式組織段可以方便地映射到鏈接器在運(yùn)行時(shí)可以直接載入的對(duì)象中!段在正在執(zhí)行的程序中是一塊內(nèi)存區(qū)域,每個(gè)區(qū)域都有特定的目的段特點(diǎn)文本段包含序的指令數(shù)據(jù)段包含經(jīng)過初始化的全局和靜態(tài)變量以及它們的值堆棧段用于保存局部變量、臨時(shí)數(shù)據(jù)、傳遞到函數(shù)中的參數(shù)第十九頁(yè),共二十七頁(yè),2022年,8月28日3.3.4C語(yǔ)言運(yùn)行在a.out里干了什么運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)種類堆?;顒?dòng)記錄(activationrecord)數(shù)據(jù)堆第二十頁(yè),共二十七頁(yè),2022年,8月28日3.3.4C語(yǔ)言運(yùn)行在a.out里干了什么堆棧段堆棧段包含一種單一的數(shù)據(jù)結(jié)構(gòu)——堆棧一塊動(dòng)態(tài)內(nèi)存區(qū)域,實(shí)現(xiàn)了一種“后進(jìn)先出”的結(jié)構(gòu)sp,用于提示堆棧當(dāng)前的頂部位置堆棧段作用堆棧為函數(shù)內(nèi)部聲明的局部變量提供存儲(chǔ)空間進(jìn)行函數(shù)調(diào)用時(shí),堆棧存儲(chǔ)與此有關(guān)的一些維護(hù)性信息堆棧也可以被用作暫時(shí)存儲(chǔ)區(qū)第二十一頁(yè),共二十七頁(yè),2022年,8月28日3.3.4C語(yǔ)言運(yùn)行在a.out里干了什么如何找到段的地址聲明位于這些段的變量,并打印它們的地址在不同的計(jì)算機(jī)架構(gòu)和不同的操作系統(tǒng)中,堆棧的位置可能各不相同例:#include<stdio.h>main(){inti;
printf(”Thestacktopisnear%p\n”,&i);
return0;}第二十二頁(yè),共二十七頁(yè),2022年,8月28日3.3.5函數(shù)調(diào)用時(shí)發(fā)生了什么跟蹤調(diào)用鏈C語(yǔ)言自動(dòng)提供的服務(wù)哪些函數(shù)調(diào)用了哪些函數(shù)實(shí)現(xiàn)機(jī)制:堆棧中的過程活動(dòng)記錄過程活動(dòng)記錄是一種數(shù)據(jù)結(jié)構(gòu)支持過程調(diào)用記錄調(diào)用結(jié)束以后返回調(diào)用點(diǎn)所需要的全部信息第二十三頁(yè),共二十七頁(yè),2022年,8月28日3.3.6Auto和static關(guān)鍵字A.out及其傳說段操作系統(tǒng)在a.out里干了什么C語(yǔ)言運(yùn)行在a.out里干了什么函數(shù)調(diào)用時(shí)發(fā)生了什么Auto和static關(guān)鍵字Unix/Linux的堆棧段MS-DOS的堆棧段第二十四頁(yè),共二十七頁(yè),2022年,8月28日3.3.7Unix/Linux的堆棧段堆棧會(huì)自動(dòng)生長(zhǎng)堆棧段(stacksegment)包括兩部分:堆(heap):供動(dòng)態(tài)內(nèi)存(通過malloc申請(qǐng)的)。堆在BSS區(qū)域的上方,隨著程序不斷申請(qǐng)內(nèi)存,堆會(huì)向上增長(zhǎng),ps命令顯示的進(jìn)程占用內(nèi)存的大小也會(huì)隨之變化。棧(stack):就是維護(hù)函數(shù)調(diào)用的系統(tǒng)棧,函數(shù)的參數(shù)和本地變量(除去靜態(tài)變量)儲(chǔ)存在這里。棧位于進(jìn)程內(nèi)存空間的最高段,并隨著函數(shù)的調(diào)用向下增長(zhǎng)。函數(shù)回調(diào)時(shí),棧向上收回,其中的參數(shù)和變量數(shù)據(jù)作廢。第二十五頁(yè),共二十七頁(yè),2022年,8月28日3.3.8MS-DOS的堆棧段在DOS中,在建立可執(zhí)行文件時(shí),堆棧的大小必須同時(shí)確定,而且它不能在運(yùn)行時(shí)增長(zhǎng)。確定堆棧大小的方法根據(jù)所使用的不同編譯器而不同在Microsoft編譯器中,程序員可以把堆棧的大小作為一個(gè)鏈接器參數(shù)來確定。
STACK:nnn這個(gè)參數(shù)告訴Microsoft鏈接器為堆棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年華東師大版八年級(jí)生物上冊(cè)月考試卷
- 2025年外研版2024七年級(jí)物理下冊(cè)月考試卷含答案
- 2024版單位職工共有產(chǎn)權(quán)住房購(gòu)買合同3篇
- 2024簡(jiǎn)版第三方擔(dān)保合同書例文版
- 2024年濰坊工程職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 2024年湖州職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2024泳池場(chǎng)地租賃與水上安全教育培訓(xùn)協(xié)議范本3篇
- 網(wǎng)上聊天系統(tǒng)課程設(shè)計(jì)
- 二零二五賓館客房家具設(shè)計(jì)與定制合同3篇
- 二零二五年度橋梁健康監(jiān)測(cè)與維護(hù)委托合同范本3篇
- 2024-2025學(xué)年度第一學(xué)期三年級(jí)數(shù)學(xué)寒假作業(yè) 有答案
- 大型起重機(jī)械現(xiàn)場(chǎng)管理手冊(cè)
- 2024年貴州省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 江蘇省南京市聯(lián)合體2024-2025學(xué)年九年級(jí)上學(xué)期期中學(xué)情分析化學(xué)試卷(無答案)
- 二位數(shù)乘二位數(shù)600道
- 病例討論-病毒性肝炎
- 動(dòng)環(huán)監(jiān)控系統(tǒng)介紹文檔
- 獸藥經(jīng)營(yíng)管理制度
- 第一單元 史前時(shí)期 原始社會(huì)與中華文明的起源 單元檢測(cè)試題 2024-2025學(xué)年統(tǒng)編版七年級(jí)歷史上冊(cè)
- 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024中國(guó)華電集團(tuán)限公司校園招聘高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
評(píng)論
0/150
提交評(píng)論