




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式程序的編譯與調試第1頁,共27頁,2023年,2月20日,星期一3.1.1C語言編譯器C語言是在70年代初問世的。一九七八年由美國電話電報公司(AT&T)貝爾實驗室正式發(fā)表了C語言。早期的C語言主要是用于UNIX系統(tǒng)目前最流行的C語言編譯器有以下幾種:GNUCompilerCollection或稱GCCMicrosoftC或稱MSCBorlandTurboC或稱TurboC第2頁,共27頁,2023年,2月20日,星期一3.1.2C語言編譯過程編譯:編譯程序讀取源程序(字符流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,并且按照操作系統(tǒng)對可執(zhí)行文件格式的要求鏈接生成可執(zhí)行程序。C源程序頭文件-->預編譯處理(cpp)-->編譯程序本身-->優(yōu)化程序-->匯編程序-->鏈接程序-->可執(zhí)行文件預處理編譯階段優(yōu)化階段匯編過程連接程序第3頁,共27頁,2023年,2月20日,星期一3.1.2.1編譯預處理預處理:讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理。偽指令主要包括以下四個方面:宏定義指令如#defineName#undef條件編譯指令如#ifdef,#ifndef,#else,#elif,#endif,頭文件包含指令如#include"FileName"或者#include<FileName>等特殊符號如LINEFILE預編譯程序所完成的基本上是對源程序的“替代”工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。第4頁,共27頁,2023年,2月20日,星期一3.1.2.2編譯階段預編譯程序所要作得工作:詞法分析語法分析,翻譯成等價的中間代碼表示或匯編代碼。第5頁,共27頁,2023年,2月20日,星期一3.1.2.3優(yōu)化階段優(yōu)化處理是編譯系統(tǒng)中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬件環(huán)境也有很大的關系中間代碼的優(yōu)化不依賴于具體的計算機主要的工作是刪除公共表達式、循環(huán)優(yōu)化(代碼外提、強度削弱、變換循環(huán)控制條件、已知量的合并等)、復寫傳播,以及無用賦值的刪除,
目標代碼的生成優(yōu)化依賴于具體的計算機充分利用機器的各個硬件寄存器存放的有關變量的值,以減少對于內存的訪問次數(shù)對指令進行一些調整使目標代碼比較短,執(zhí)行的效率比較高經過優(yōu)化得到的匯編代碼必須經過匯編程序的匯編轉換成相應的機器指令,方可能被機器執(zhí)行第6頁,共27頁,2023年,2月20日,星期一3.1.2.4匯編階段匯編過程實際上指把匯編語言代碼翻譯成目標機器指令的過程目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成代碼段該段中所包含的主要是程序的指令。該段一般是可讀和可執(zhí)行的,但一般卻不可寫。數(shù)據(jù)段主要存放程序中要用到的各種全局變量或靜態(tài)的數(shù)據(jù)。一般數(shù)據(jù)段都是可讀,可寫,可執(zhí)行的。第7頁,共27頁,2023年,2月20日,星期一3.1.2.4匯編階段UNIX環(huán)境下主要有三種類型的目標文件:可重定位文件其中包含有適合于其它目標文件鏈接來創(chuàng)建一個可執(zhí)行的或者共享的目標文件的代碼和數(shù)據(jù)。共享的目標文件這種文件存放了適合于在兩種上下文里鏈接的代碼和數(shù)據(jù)。第一種事鏈接程序可把它與其它可重定位文件及共享的目標文件一起處理來創(chuàng)建另一個目標文件;第二種是動態(tài)鏈接程序將它與另一個可執(zhí)行文件及其它的共享目標文件結合到一起,創(chuàng)建一個進程映象。可執(zhí)行文件它包含了一個可以被操作系統(tǒng)創(chuàng)建一個進程來執(zhí)行之的文件。匯編程序生成的實際上是第一種類型的目標文件。對于后兩種還需要其他的一些處理方能得到,這個就是鏈接程序的工作了。第8頁,共27頁,2023年,2月20日,星期一3.1.2.5鏈接階段鏈接程序是將有關的目標文件彼此相連接,使得所有的這些目標文件成為一個能夠被操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。目標文件由段組成鏈接處理可分為兩種:靜態(tài)鏈接動態(tài)鏈接第9頁,共27頁,2023年,2月20日,星期一3.1.3Makefilemakefile是用于自動編譯和鏈接的makefile能夠紀錄文件的信息,決定在鏈接的時候需要重新編譯哪些文件第10頁,共27頁,2023年,2月20日,星期一3.2嵌入式C程序的編譯過程創(chuàng)建過程編譯鏈接定址第11頁,共27頁,2023年,2月20日,星期一3.2.1創(chuàng)建過程源代碼轉換為可執(zhí)行的二進制映像的過程源文件都被編譯或匯編到一個目標文件(objectfile)可重定位程序(relocatableprogram)重定址(relocation)的過程第12頁,共27頁,2023年,2月20日,星期一3.2.2編譯編譯器的工作主要是把用人可讀的語言所書寫的程序,翻譯為特定的處理器上等效的一系列操作碼。第13頁,共27頁,2023年,2月20日,星期一3.2.3鏈接創(chuàng)建過程編譯鏈接定址第14頁,共27頁,2023年,2月20日,星期一3.2.4定址創(chuàng)建過程編譯鏈接定址第15頁,共27頁,2023年,2月20日,星期一3.3程序運行A.out及其傳說段操作系統(tǒng)在a.out里干了什么C語言運行在a.out里干了什么函數(shù)調用時發(fā)生了什么Auto和static關鍵字Unix/Linux的堆棧段MS-DOS的堆棧段第16頁,共27頁,2023年,2月20日,星期一3.3.1A.out及其傳說A.out-----“assembleroutput(匯編程序輸出)”的縮寫形式a.out文件格式分析a.out文件包含7個section,格式如下:execheader(執(zhí)行頭部,也可理解為文件頭部)textsegment(文本段)datasegment(數(shù)據(jù)段)textrelocations(文本重定位段)datarelocations(數(shù)據(jù)重定位段)symboltable(符號表)stringtable(字符串表)a.out是早期UNIX系統(tǒng)使用的可執(zhí)行文件格式,由AT&T設計,現(xiàn)在基本上已被ELF文件格式代替第17頁,共27頁,2023年,2月20日,星期一3.3.2段段(segments):是二進制文件中簡單的區(qū)域,里面保存了和某種特定類型(如符號表條目)相關的所有信息段可以方便地映射到鏈接器在運行時可以直接載入的對象中段在正在執(zhí)行的程序中是一塊內存區(qū)域,每個區(qū)域都有特定的目的
第18頁,共27頁,2023年,2月20日,星期一3.3.3操作系統(tǒng)在a.out里干了什么為什么a.out要以段的形式組織段可以方便地映射到鏈接器在運行時可以直接載入的對象中!段在正在執(zhí)行的程序中是一塊內存區(qū)域,每個區(qū)域都有特定的目的段特點文本段包含序的指令數(shù)據(jù)段包含經過初始化的全局和靜態(tài)變量以及它們的值堆棧段用于保存局部變量、臨時數(shù)據(jù)、傳遞到函數(shù)中的參數(shù)第19頁,共27頁,2023年,2月20日,星期一3.3.4C語言運行在a.out里干了什么運行時數(shù)據(jù)結構種類堆?;顒佑涗?activationrecord)數(shù)據(jù)堆第20頁,共27頁,2023年,2月20日,星期一3.3.4C語言運行在a.out里干了什么堆棧段堆棧段包含一種單一的數(shù)據(jù)結構——堆棧一塊動態(tài)內存區(qū)域,實現(xiàn)了一種“后進先出”的結構sp,用于提示堆棧當前的頂部位置堆棧段作用堆棧為函數(shù)內部聲明的局部變量提供存儲空間進行函數(shù)調用時,堆棧存儲與此有關的一些維護性信息堆棧也可以被用作暫時存儲區(qū)第21頁,共27頁,2023年,2月20日,星期一3.3.4C語言運行在a.out里干了什么如何找到段的地址聲明位于這些段的變量,并打印它們的地址在不同的計算機架構和不同的操作系統(tǒng)中,堆棧的位置可能各不相同例:#include<stdio.h>main(){inti;
printf(”Thestacktopisnear%p\n”,&i);
return0;}第22頁,共27頁,2023年,2月20日,星期一3.3.5函數(shù)調用時發(fā)生了什么跟蹤調用鏈C語言自動提供的服務哪些函數(shù)調用了哪些函數(shù)實現(xiàn)機制:堆棧中的過程活動記錄過程活動記錄是一種數(shù)據(jù)結構支持過程調用記錄調用結束以后返回調用點所需要的全部信息第23頁,共27頁,2023年,2月20日,星期一3.3.6Auto和static關鍵字A.out及其傳說段操作系統(tǒng)在a.out里干了什么C語言運行在a.out里干了什么函數(shù)調用時發(fā)生了什么Auto和static關鍵字Unix/Linux的堆棧段MS-DOS的堆棧段第24頁,共27頁,2023年,2月20日,星期一3.3.7Unix/Linux的堆棧段堆棧會自動生長堆棧段(stacksegment)包括兩部分:堆(heap):供動態(tài)內存(通過malloc申請的)。堆在BSS區(qū)域的上方,隨著程序不斷申請內存,堆會向上增長,ps命令顯示的進程占用內存的大小也會隨之變化。棧(stack):就是維護函數(shù)調用的系統(tǒng)棧,函數(shù)的參數(shù)和本地變量(除去靜態(tài)變量)儲存在這里。棧位于進程內存空間的最高段,并隨著函數(shù)的調用向下增長。函數(shù)回調時,棧向上收回,其中的參數(shù)和變量數(shù)據(jù)作廢。第25頁,共27頁,2023年,2月20日,星期一3.3.8MS-DOS的堆棧段在DOS中,在建立可執(zhí)行文件時,堆棧的大小必須同時確定,而且它不能在運行時增長。確定堆棧大小的方法根據(jù)所使用的不同編譯器而不同在Microsoft編譯器中,程序員可以把堆棧的大小作為一個鏈接器參數(shù)來確定。
STACK:nnn這個參數(shù)告訴Microsoft鏈接器為堆棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合股賣水泥合同范本
- 勞務分包單位合同范本
- 勞務合同范本車輛
- 微信租房合同范本
- 與單位簽正式合同范本
- 廠內車間出租合同范本
- 化肥生產合同范本
- 做建設合同范本
- 合同范本嬰兒車
- 分期付款機器買賣合同范本
- 專題05標點符號考點專訓(01)(含答案)2025年新高考語文一輪復習考點滿分寶典
- 保密法實施條例培訓
- 鉗工工藝學(第6版)完整全套教學課件
- DB11T 1035-2013 城市軌道交通能源消耗評價方法
- 老年科護士進修匯報
- 2024新能源光伏電站運行規(guī)程和檢修規(guī)程
- 同等學力英語申碩考試詞匯(第六版大綱)電子版
- 有機化學完整版本
- 銀行存管三方協(xié)議書
- 2024-2030年中國婦幼保健行業(yè)發(fā)展分析及發(fā)展前景與趨勢預測研究報告
- 2024年新人教版化學九年級上冊全冊課件(新版教材)
評論
0/150
提交評論