版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第4章 TMS320C54x的軟件開發(fā)4.1 TMS320C54x軟件開發(fā)過程 4.2 匯編語言程序的編寫方法4.3 匯編偽指令和宏指令4.4 公共目標文件格式COFF4.5 匯編源程序的編輯、匯編和鏈接4.6 匯編語言程序設計4.7 C語言與匯編混合編程4.4 公共目標文件格式公共目標文件格式COFF COFF (Common Object ,COFF) :匯編器和鏈接器所:匯編器和鏈接器所創(chuàng)建的目標文件創(chuàng)建的目標文件 。 COFF的核心概念:的核心概念:使用代碼塊(段)和數據塊(段)使用代碼塊(段)和數據塊(段)編程編程,而不是指令或數據簡單的順序編寫。,而不是指令或數據簡單的順序編寫。采
2、用段形式的優(yōu)點:采用段形式的優(yōu)點: 更利于模塊化編程,管理代碼段和目標系統存儲器更利于模塊化編程,管理代碼段和目標系統存儲器更靈活更靈活 不必為程序代碼或變量指定目標地址,這為程序編不必為程序代碼或變量指定目標地址,這為程序編寫和程序移植提供了極大的方便;寫和程序移植提供了極大的方便; 能與系統存儲單元充分配合;能與系統存儲單元充分配合; 4.4.1 COFF文件中的段文件中的段 段段(Sections)是是COFF文件中最重要的概念。文件中最重要的概念。 段段就是在編寫匯編語言源程序時,采用的就是在編寫匯編語言源程序時,采用的代碼塊代碼塊或或數據塊數據塊,它占據存儲器的某個連續(xù)空間。,它占據
3、存儲器的某個連續(xù)空間。 在編寫匯編語言源程序時,程序是按段組織的;在編寫匯編語言源程序時,程序是按段組織的; 每行匯編語句從屬一個段,由偽指令標明該段的屬性;每行匯編語句從屬一個段,由偽指令標明該段的屬性; 一個目標文件中的每個段都是分開的和各不相同的。一個目標文件中的每個段都是分開的和各不相同的。所有的所有的COFF目標文件都包含以下目標文件都包含以下3種形式的段:種形式的段: .text段段(此段通常包含可執(zhí)行代碼此段通常包含可執(zhí)行代碼); .data段段(此段通常包含初始化數據此段通常包含初始化數據); .bss 段段(此段通常為未初始化變量保留存儲空間此段通常為未初始化變量保留存儲空間
4、)。 此外,匯編器和鏈接器可以建立、命名和鏈接自定義此外,匯編器和鏈接器可以建立、命名和鏈接自定義段。段。 自定義段是程序員自己定義(命名)的段;自定義段是程序員自己定義(命名)的段;使用起來與使用起來與.data、.text以及以及.bss段類似;段類似;它的好處是在目標文件中與它的好處是在目標文件中與.data、.text以及以及.bss分開匯分開匯編,鏈接時作為一個單獨的部分分配到存儲器。編,鏈接時作為一個單獨的部分分配到存儲器。有有2種形式:種形式: .sect 建立的自定義段是已初始化段;建立的自定義段是已初始化段; .usect 建立的自定義段是未初始化段。建立的自定義段是未初始化
5、段。 .bss .data .text RAM EEPROM ROM 目標文件 目標存儲器 匯編器根據偽指令用適當的段將各部分程序代碼和數據連在一起,構成目標文件; 鏈接器分配存儲單元,即把各個段重新定位到目標存儲器中。 圖4.2 目標文件中的段與目標存儲器之間的關系4.4.2 匯編器對段的處理匯編器對段的處理 匯編器對段的處理是通過段定義偽指令區(qū)分出各個段,且匯編器對段的處理是通過段定義偽指令區(qū)分出各個段,且將段名相同的語句匯編在一起。將段名相同的語句匯編在一起。 匯編器有匯編器有5個段定義偽指令支持該功能,這個段定義偽指令支持該功能,這5個偽指令個偽指令是:是:.bss,.usect,.t
6、ext, .data, .sect 如果匯編語言程序中一個段偽指令都沒有用,匯編器會如果匯編語言程序中一個段偽指令都沒有用,匯編器會把程序中的內容都匯編到把程序中的內容都匯編到.text段。段。 匯編器對不同類型段的處理不同。匯編器對不同類型段的處理不同。1. 未初始化段未初始化段 未初始化段未初始化段(Uninitialized sections)由由.bss和和.usect偽指令偽指令建立。建立。 未初始化段就是在目標存儲器中的保留空間,以供程未初始化段就是在目標存儲器中的保留空間,以供程序運行過程中的序運行過程中的變量變量作為臨時存儲空間使用。作為臨時存儲空間使用。 在目標文件中,這些段
7、中沒有確切的內容,通常它們在目標文件中,這些段中沒有確切的內容,通常它們定位到定位到RAM區(qū)。區(qū)。未初始化段分為默認的和命名的未初始化段分為默認的和命名的2種,其句法如下種,其句法如下 .bss符號,字數符號,字數 符號符號 .usect“段名段名”,字數,字數每調用每調用.bss偽指令一次,匯編器在相應段保留預留字數偽指令一次,匯編器在相應段保留預留字數的空間;的空間;每調用每調用.usect偽指令一次,匯編器在指定的命名段保留偽指令一次,匯編器在指定的命名段保留預留字數的空間。預留字數的空間。2. 初始化段初始化段 初始化段初始化段(Initialized sections)由由.text
8、、.data和和.sect偽指令偽指令建立,包含可執(zhí)行代碼或初始化數據。建立,包含可執(zhí)行代碼或初始化數據。 這些段中的內容都在目標文件中,當加載程序時再放到這些段中的內容都在目標文件中,當加載程序時再放到存儲器中。存儲器中。 每個初始化段都是可以重新定位的,并且可以引用其他每個初始化段都是可以重新定位的,并且可以引用其他段中所定義的符號。鏈接器在連接時自動處理段間的相互段中所定義的符號。鏈接器在連接時自動處理段間的相互引用。引用。 3種初始化偽指令的句法如下:種初始化偽指令的句法如下: .text 段起點段起點 .data 段起點段起點 .sect “段名段名”,段起點,段起點二者的不同:二者
9、的不同: 當匯編器遇到當匯編器遇到.text或或.data或或.sect偽指令時,將偽指令時,將停止停止對當前段的匯編對當前段的匯編(相當于一條結束當前段匯編的偽指相當于一條結束當前段匯編的偽指令令),然后將緊跟著的程序代碼或數據匯編到指定的段,然后將緊跟著的程序代碼或數據匯編到指定的段中,直到再遇到另一條中,直到再遇到另一條.text或或.data或或.sect偽指令為止。偽指令為止。 而當匯編器遇到而當匯編器遇到.bss和和.usect偽指令時,偽指令時,并不結束當并不結束當前段的匯編前段的匯編,只是暫時從當前段脫離出來,并開始對,只是暫時從當前段脫離出來,并開始對新的段進行匯編。新的段進
10、行匯編。.bss和和.usect偽指令可以出現在一個偽指令可以出現在一個已初始化段的任何位置上,而不會對它的內容發(fā)生影已初始化段的任何位置上,而不會對它的內容發(fā)生影響。響。3. 自定義段自定義段 .usect和和.sect可以創(chuàng)建自定義的段。可以創(chuàng)建自定義的段。自定義段是用戶自己創(chuàng)建的,可以同默認自定義段是用戶自己創(chuàng)建的,可以同默認的的.test .data .bss段一樣使用,但它們之間是單獨匯編的。段一樣使用,但它們之間是單獨匯編的??蔀槟切┪闯跏蓟摹⒉辉诳蔀槟切┪闯跏蓟?、不在.bss段的變量保留空段的變量保留空間。間。.usect創(chuàng)建同創(chuàng)建同.bss段一樣使用的自定義段,它在段一樣使
11、用的自定義段,它在RAM中為變量保留空間。中為變量保留空間。也可以匯編已初始化的、不在也可以匯編已初始化的、不在.data段中的數據,段中的數據,.sect創(chuàng)創(chuàng)建像默認的建像默認的.text和和.data一樣的段,可一樣的段,可包含代碼和數據包含代碼和數據,而,而且有可重定位的地址。且有可重定位的地址。4. 段程序計數器段程序計數器(SPC) 匯編器為每個段都安排一個單獨的段程序計數器匯編器為每個段都安排一個單獨的段程序計數器(SPC)。 SPC表示一個程序表示一個程序代碼段代碼段或或數據段數據段內的當前地址。內的當前地址。 一開始,匯編器將每個一開始,匯編器將每個SPC置置0。當匯編器將程序
12、代碼。當匯編器將程序代碼段或數據加到一個段內時,相應的段或數據加到一個段內時,相應的SPC就增加。如果繼就增加。如果繼續(xù)對某個段匯編,則相應的續(xù)對某個段匯編,則相應的SPC就在先前的數值上繼續(xù)就在先前的數值上繼續(xù)增加。增加。 鏈接器在鏈接時要對每個段進行重新定位。鏈接器在鏈接時要對每個段進行重新定位。 【例【例4.4】 段偽指令應用舉例。段偽指令應用舉例。行行SPC 代碼代碼 匯編源代碼匯編源代碼1 0000 .data ;匯編至;匯編至.data段段2 0000 0011 coeff .word 011h, 022h, 033h 0001 0022 0002 00333 0000 .bss
13、buffer, 10 ;在;在.bss段為段為buffer變量變量 ;保留;保留10個字的空間個字的空間4 0003 0123 ptr .word 0123h ;繼續(xù)匯編至繼續(xù)匯編至.data段段5 0000 .text ;匯編至;匯編至.text 段段6 0000 100f add: LD 0Fh, A7 0001 f010 aloop: SUB #1, A 0002 00018 0003 f842 BC aloop, AGEQ ;A=0跳轉跳轉aloop 0004 0001 9 0004 .data10 0004 00aa ivals .word 0AAh,0BBh,0CCh;繼續(xù)匯編至繼
14、續(xù)匯編至.data段段 0005 00bb 0006 00cc11 0000 var2 .usect “newvars”,1 ;自定義數據段,保留;自定義數據段,保留8 ;個字的空間;個字的空間12 0001 inbuf .usect “newvars”,713 0005 .text ;繼續(xù)匯編至;繼續(xù)匯編至.text 段段14 0005 110a mpy:LD 0Ah, B15 0006 f166 mloop:MPY #0Ah, B 0007 000a16 0008 f868BC mloop, BNOV ;B not overflow 0009 000617 0000 .sect “vect
15、ors” ;自定義數據段,;自定義數據段, ;包含;包含2個初始化字個初始化字18 0000 0011 .word 011h, 033h19 0001 0033 field1 field2 field3 field4行號行號 SPC 代碼代碼 源程序源程序行號 目標代碼 段名 行號 目標代碼 段名 100f f010 0001 f842 0001 110a f116 000a f868 0006 沒有數據保留8 個字 .text newvars 5 7 7 8 8 14 15 15 16 16 15 15 16 16 0011 0033 沒有數據保留10 個字 vectors .bss 18
16、19 19 3 11 12 .data 0011 0022 0033 0123 00aa 00bb 00cc 2 2 2 4 10 10 10 共建立了5個段。目標代碼圖4.4.3 鏈接器對段的處理鏈接器對段的處理 鏈接器在處理段的時候,有如下鏈接器在處理段的時候,有如下2個主要任務:個主要任務: 將由匯編器產生的將由匯編器產生的COFF格式的一個或多個格式的一個或多個.obj文件鏈文件鏈接成一個可執(zhí)行的接成一個可執(zhí)行的.out文件文件; 重新定位,將輸出的段分配到相應的存儲器空間。重新定位,將輸出的段分配到相應的存儲器空間。 鏈接器有鏈接器有2條命令支持上述任務:條命令支持上述任務:(1)
17、MEMORY命令。命令。定義目標系統的定義目標系統的存儲器配置圖存儲器配置圖,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度;長度;(2) SECTIONS命令。命令。告訴鏈接器如何將輸入段組合成告訴鏈接器如何將輸入段組合成輸出段,以及將輸出段放在存儲器中的什么位置。輸出段,以及將輸出段放在存儲器中的什么位置。1. MEMORY命令命令 作用:作用:定義系統中所包含的各種形式的存儲器,以及定義系統中所包含的各種形式的存儲器,以及它們占據的地址范圍。它們占據的地址范圍。 句法:句法:MEMORYPAGE0: name 1(attr): ori
18、gn=constant, length=constant;PAGEl:name n(attr): orign=constant, length=constant;PAGE對一個對一個存儲空間存儲空間加以標記。通常加以標記。通常PAGE 0程序存儲器,程序存儲器,PAGE l定為數據存儲器。定為數據存儲器。Name對一個對一個存儲區(qū)間存儲區(qū)間取名。取名。 Origin存儲區(qū)的起始地址。鍵入存儲區(qū)的起始地址。鍵入Origin、Org或或O都可都可Length規(guī)定存儲區(qū)的長度。鍵入規(guī)定存儲區(qū)的長度。鍵入Length、Len或或L都可以都可以Attr這是一個任選項,為命名區(qū)規(guī)定這是一個任選項,為命名區(qū)
19、規(guī)定14個屬性(個屬性(RWXI)。)。 【例【例4.5】 MEMORY命令的使用。命令的使用。MEMORYPAGE 0: ROM: origin=0c00h, length=1000h;PAGE 1: SCRATCH: origin=60h, length=20h; ONCHIP: origin=80h, length=200h;上述上述MEMORY命令所定義的系統的存儲器配置如下:命令所定義的系統的存儲器配置如下:PAGE 0為程序存儲器,名為程序存儲器,名ROM,起始地址,起始地址0C00H,長度,長度4K字。字。PAGE l為數據存儲器,名為數據存儲器,名SCRATCH,起始地址,起始
20、地址60H,長,長32字。字。 PAGE l為數據存儲器,名為數據存儲器,名ONCHIP,起始地址,起始地址80H,長度,長度512字。字。2. SECTIONS命令命令作用:說明如何將輸入段組合成輸出段;作用:說明如何將輸入段組合成輸出段; 規(guī)定輸出段在存儲器中的存放位置;規(guī)定輸出段在存儲器中的存放位置; 并允許重新命名輸出段。并允許重新命名輸出段。句法:句法:SECTIONSname:property,property,property,name:property,property,property,name:property,property,property,Name段名,每一個輸出段
21、的說明都從段名開始。段名,每一個輸出段的說明都從段名開始。Property性能參數,段名后面是一行性能參數,段名后面是一行說明段的內容說明段的內容和和如何給段分配存儲單元如何給段分配存儲單元的性能參數。的性能參數。 一個段主要的性能參數有:一個段主要的性能參數有:裝入存儲器分配裝入存儲器分配(Load allocation)。 定義段裝入時的存儲器地址,語法為定義段裝入時的存儲器地址,語法為 load=allocation(這里這里allocation指地址指地址) 或或allocation 或或allocation(2) 運行存儲器分配運行存儲器分配(Run allocation)。 定義段
22、運行時的存儲器地址,語法為定義段運行時的存儲器地址,語法為 run=allocation runallocation 【例【例4.6】 SECTIONS命令的使用。命令的使用。 SECTIONS .text: load=ROM, run=800h .bss: load=RAM .vectors: load=FF80h.bss段結合和的段結合和的.bss段且被裝入段且被裝入RAM空間??臻g。.text段結合和的段結合和的.text段,鏈接器將所有命名為段,鏈接器將所有命名為.text的段都的段都結合進該段,在程序運行時該段必須重新定位在地址結合進該段,在程序運行時該段必須重新定位在地址0800h
23、。.vectors段定位在地址段定位在地址FF80h。3. MEMORY和SECTIONS命令的缺省算法 如果沒有利用MEMORY和SECTIONS命令,鏈接器就按缺省算法來定位輸出段:MEMORYPAGE 0:PROG:origin=0 x0080, length=0 xFF00PAGE 1:DATA:origin=0 x0080, length=0 xFF80SECTIONS .text:PAGE=0 .data:PAGE=0 .cinit:PAGE=0 .bss: PAGE=14.5 匯編源程序的編輯、匯編和鏈接過程匯編源程序的編輯、匯編和鏈接過程 文本編輯器 匯編器 鏈接器 測試程序
24、.asm 源文件 .obj 目標文件 .out 輸出文件 鏈接命令文件 .cmd .lst 列表文件 .map 存儲器映像文件 十六進制 轉換程序 m 1 l 4.5.1 編輯編輯: 利用諸如利用諸如Word、Edit、記事本等文本編輯器,編寫匯、記事本等文本編輯器,編寫匯編語言源程序,后綴為編語言源程序,后綴為.asm。4.5.2 匯編器匯編器 作用作用: 匯編語言源文件匯編語言源文件(.asm)翻譯成機器語言目標文件翻譯成機器語言目標文件(.obj) 。 輸入文件輸入文件: 匯編語言源文件,其省缺的文件擴展名匯編語言源文件,其省缺的文件擴展名是是.asm。 1. 匯編器的功能匯編器的功能(
25、1) 處理源語句,產生一個可重新定位的目標文件處理源語句,產生一個可重新定位的目標文件(.obj);(2) 根據要求,產生源列表文件根據要求,產生源列表文件(.lst),并提供對該列表的,并提供對該列表的控制;控制;(3) 根據要求,將交叉引用列表添加到源程序列表中;根據要求,將交叉引用列表添加到源程序列表中;(4) 將代碼分段;設置一個段程序記數器將代碼分段;設置一個段程序記數器(SPC);(5) 定義和引用全局符號;定義和引用全局符號;2. 匯編器的調用匯編器的調用命令格式如下命令格式如下 asm500input file-options其中:其中:input file匯編源文件名,缺省后
26、綴為匯編源文件名,缺省后綴為.asm;object file編譯輸出的目標文件名,缺省后綴為編譯輸出的目標文件名,缺省后綴為.obj;listing file產生的列表文件名,缺省后綴為產生的列表文件名,缺省后綴為.lst;options編譯器使用的各種選項,每個選項前面加有短橫。編譯器使用的各種選項,每個選項前面加有短橫。常用選項有:常用選項有:-c:編譯器忽略字母的大小寫。:編譯器忽略字母的大小寫。-1:(小寫的小寫的L)在編譯時產生列表文件,缺省后綴為在編譯時產生列表文件,缺省后綴為.lst。 -s:將所有的符號都放入符號表。:將所有的符號都放入符號表。-x:產生一個交叉匯編表,并把它附
27、加到列表文件的最后。:產生一個交叉匯編表,并把它附加到列表文件的最后。例如:例如:asm500 example.asm -l -s -x2. 列表文件列表文件 列表文件包括源程序的行號、段程序計數器列表文件包括源程序的行號、段程序計數器(SPC)、目標代碼、目標代碼和源程序和源程序4個部分。個部分。【例【例4.7】 列表文件舉例列表文件舉例(example.lst部分部分)10 0000040008.word 8,6,4,2 0000050006 0000060004 0000070002 11 000000.text ;code follows12 0000007728start: STM
28、#0,SWWSR ;adds no wait states 0000010000 4.5.3 鏈接器鏈接器1. 鏈接器的功能鏈接器的功能作用作用: 將擴展名為將擴展名為.obj的一個或多個的一個或多個COFF目標文件鏈接目標文件鏈接起來,生成可執(zhí)行的輸出文件起來,生成可執(zhí)行的輸出文件(.out)和存儲器映像文件和存儲器映像文件(.map)。功能:功能:(1) 將各個段配置到目標系統的存儲器中;將各個段配置到目標系統的存儲器中;(2) 對各個符號和段進行重新定位,并給它們制定一個對各個符號和段進行重新定位,并給它們制定一個確定的地址;確定的地址;(3) 解決輸入文件之間未定義的外部引用。解決輸入文件之間未定義的外部引用。2. 鏈接命令文件鏈接命令文件(擴展名為擴展名為.cmd) 鏈接命令文件是將鏈接命令文件是將鏈接的信息鏈接的信息放在一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型綠色能源項目場地租賃合同2篇
- 《登高》說課稿 2024-2025學年統編版高中語文必修上冊
- 2025年學校食堂豬肉直供與配送服務合同3篇
- 二零二五年度教育信息化項目合作協議2篇
- 一年級數學計算題專項練習集錦
- 小學科學教育與醫(yī)療健康的關聯
- 二零二五年度房屋買賣居間服務合同保險保障合同3篇
- 2025年滬科新版七年級地理上冊月考試卷含答案
- 二零二五年度城市更新項目土地使用權轉讓合同2篇
- 2025年華東師大版九年級地理下冊月考試卷含答案
- 《沙盤技術》教學大綱
- 職業(yè)培訓師培訓課件
- (新版)多旋翼無人機超視距駕駛員執(zhí)照參考試題庫(含答案)
- 哈利波特中英文全集
- DLT5210.1-電力建設施工質量驗收及評價規(guī)程全套驗評表格之歐陽法創(chuàng)編
- 500句漢語日常對話
- 《抽搐的鑒別與處理》課件
- 2024-2030年中國凈菜加工行業(yè)產能預測及投資規(guī)模分析報告版
- 自來水廠建設項目可行性研究報告
- 承諾保證協議
- 2025年公司副總經理述職報告范文
評論
0/150
提交評論