




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第三章 TMS320C54x 軟件開發(fā)過程3.1 TMS320C54x應(yīng)用軟件開發(fā)過程3.2 匯編語言程序的編輯、匯編和鏈接過程3.3 匯編偽指令3.4 匯編宏指令3.5 COFF的一般概念3.6 C語言程序設(shè)計概述3.7 混合編程3.8 小結(jié)【重點難點】 段的定義和用法 鏈接命令文件 C 語言編程 混合編程TMS320C54x應(yīng)用軟件開發(fā)過程3.1 TMS320C54x應(yīng)用軟件開發(fā)過程軟件開發(fā)流程圖將C語言源程序自動地編譯為C54x 的匯編語言源程序。即生成.asm文件。 將匯編語言源文件匯編成基于公用目標文件格式的機器語言目標文件。即生成.obj文件。 將匯編生成的、可重新定位的COFF目
2、標模塊組合成一個可執(zhí)行的COFF目標模塊。 將一組文件(源文件或目標文件)集中為一個文檔文件庫。 將包含助記符指令的匯編語言源文件轉(zhuǎn)換成包含代數(shù)指令的匯編語言源文件。 建立用戶自己用的、C語言編寫的支持運行的庫函數(shù)。 建立用戶的C語言運行支持庫。標準運行支持庫在rts.src 里提供源代碼,在rts.lib里提供目標代碼。 將COFF目標文件轉(zhuǎn)換TI、Intel、Motorola或Tektronix公司的目標文件格式。 生成abs輸出文件。對abs文件匯編產(chǎn)生包含絕對地址(而不是相對地址)的清單。 生成一個交叉引用清單,列出所鏈接的源文件中的符號及其定義和引用情況。 開發(fā)目的:產(chǎn)生一個可由C5
3、4x目標系統(tǒng)執(zhí)行的模塊。 調(diào)試工具: 軟件仿真器(Simulator) 可擴展的開發(fā)系統(tǒng)硬件仿真器XDS510(Emulator) 評價模塊(EVM) DSK開發(fā)套件 需要開發(fā)人員編寫的文件: 源程序(.c或.asm) 鏈接命令文件(.cmd) 中斷向量表TMS320C54x應(yīng)用軟件開發(fā)過程3.2 匯編語言程序的 編輯、匯編和鏈接過程匯編語言程序的編輯、匯編和鏈接過程匯編器調(diào)試程序鏈接器文本編輯器.asm源文件.obj目標文件.out輸出文件. cmd鏈接命令文件. lst列表文件. map存儲器映像文件十六進制轉(zhuǎn)換程序HEX500- o- m- l匯編偽指令3.3 匯編偽指令8種偽指令: 1
4、)段定義偽指令; 2)常數(shù)初始化偽指令; 3)段程序計數(shù)器定位偽指令; 4)輸出列表格式偽指令; 5)引用其他文件的偽指令; 6)條件匯編偽指令; 7)匯編時符號定義偽指令; 8)其他匯編偽指令。1)段定義偽指令 .bss symbol, size in words ,blocking flag,alignment flag 為未初始化變量在.bss段內(nèi)保留空間,可在RAM中分配變量。 必需參數(shù),定義了指向偽指令所保留的第一個單元地址的符號,符號名對應(yīng)于所要保留空間的變量。必需參數(shù),應(yīng)該是絕對表達式。匯編器在 .bss段內(nèi)分配size個字。 可選參數(shù)。如果該參數(shù)大于0,匯編器分配連續(xù)的size
5、個字。也就是說除非size大于一頁,否則被分配的空間不會跨越頁邊界。 可選參數(shù)。如果該參數(shù)大于0,段對準到長字邊界 symbol .usect “段名”, 字數(shù) ,blocking flag,alignment flag 在一個未初始化的命名段中保留空間。必需參數(shù),定義了指向偽指令所保留的第一個單元地址的符號,符號名對應(yīng)于所要保留空間的變量。必需參數(shù),應(yīng)該是絕對表達式。定義了保留的字數(shù)。 可選參數(shù)。如果該參數(shù)大于0,匯編器分配連續(xù)的size個字。也就是說除非size大于一頁,否則被分配的空間不會跨越頁邊界。 可選參數(shù)。如果該參數(shù)大于0,段對準到長字邊界命名了未初始化段。注意必須包含在雙引號內(nèi)。
6、 .data 包含初始化數(shù)據(jù)。使匯編器開始把源代碼中的初始化數(shù)據(jù)匯編到.data段內(nèi),且.data變?yōu)楫斍岸巍?.sect “section name”:定義包含代碼或數(shù)據(jù)的已初始化命名段,將緊隨其后的代碼或數(shù)據(jù)存入該段。 .text :包含可執(zhí)行的代碼。如果還沒有代碼被匯編到.text段中,那么段程序計數(shù)器被設(shè)置為0,否則段程序計數(shù)器恢復到它原先在段內(nèi)的值。.text是默認段,除非規(guī)定了另外的偽指令,否則在匯編開始時,匯編器將把代碼匯編到.text段。 段名,注意section name必須包含在雙引內(nèi)。 匯編偽指令2)常數(shù)初始化偽指令 .bes size in bits .space si
7、ze in bits 在當前段中保留size個數(shù)的位,匯編器對這些保留的位填0,可用位數(shù)乘以16來實現(xiàn)保留字。注意:.bes 指向包含保留位的最后一個字, .space指向包含保留位的第一個字。 .byte value1 ,,valuen:在當前段內(nèi)初始化一個或多個 連續(xù)的8位字。 .field value ,size in bits:將單個值放進當前字的指定位域。此指令可將數(shù)值放入當前字中規(guī)定的位數(shù),并從最高有效位開始。在字被填滿前,匯編器不增加段程序計數(shù)器(SPC)的值。匯編偽指令 .float value1 ,valuen:計算以IEEE格式表示的單 精度(32位)浮點數(shù),并將它存儲在當
8、前段的兩個連 續(xù)的字中,先存最高有效位。 .int value1 ,valuen .word value1 ,valuen兩指令等價,將一個或多個值放在當前段的連續(xù)的16位域中。 .long value1 ,valuen: 將32位的值存儲在當前段的兩個連續(xù)字中,先存最高有效位。 .string “string1”,“stringn” .pstring “string1”,“stringn” 將一個或多個字符串中的8位字符放進當前段。 二者的區(qū)別在于:.string將8位字符放入當前段的連續(xù)字中, .pstring將兩個8位的字符打包成一個字。匯編偽指令3)段程序計數(shù)器定位偽指令 .align
9、size根據(jù)size 的值將段程序計數(shù)器(SPC)對準在1128字的邊界,這保證了在偽指令后面的代碼開始在某個字或頁面的邊界上。(1)操作數(shù)為1,對準SPC到字的邊界;(2)操作數(shù)為2,對準SPC到長字(偶數(shù)地址)的邊界;(3)操作數(shù)為128,對準SPC到頁面的邊界;(4)沒有操作數(shù)時,默認為頁面邊界。匯編偽指令4)輸出列表格式偽指令 .drnolist 在列表文件中禁止打印下述偽指令, .drlist 允許下述偽指令在列表文件中出現(xiàn)。 .asg .fcnolist .ssnolist .break .mlist .var .emsg .wmsg .mmsg .eval .mnolist .f
10、clist .sslist .fclist 允許列出條件為假的代碼塊,缺省方式。 .fcnolist 禁止列出條件為假的代碼塊。 .length 頁面長度 控制文件列表的頁面長度。 .nolist 在列表文件中不打印所選擇的源語句。 .list 在列表文件中打印所選擇的源語句。匯編偽指令 .mnolist 禁止宏擴展和循環(huán)塊在列表文件中出現(xiàn) .mlist 允許宏擴展和循環(huán)塊在列表文件中出現(xiàn),這是 匯編的默認行為。 .page 在列表文件中產(chǎn)生新的一頁。 .ssnolist 禁止替代符號擴展的列出。 .sslist 允許替代符號擴展的列出。 .tab size 定義制表符的大小。 .title
11、“string” 提供了匯編器在每頁頂部打印的標題。 .width page width 控制列表文件頁面的寬度。匯編偽指令5)引用其他文件和符號偽指令 .include “filename” 告訴匯編器開始從其他文件讀取 源代碼語句,源語句不出現(xiàn)在列表文件中。其內(nèi)容可以 是程序、數(shù)據(jù)、符號定義等。 .copy “filename” 告訴匯編器開始從其他文件讀取 源代碼語句,源語句出現(xiàn)在列表文件中。其內(nèi)容可以是 程序、數(shù)據(jù)、符號定義等。 .def 符號名1,符號名n在當前文件中定義一個或 多個符號,該符號可以被其他文件使用。 .ref 符號名1,符號名n在其他文件中定義一個或 多個符號,該符號
12、可以在本文件中使用。匯編偽指令6)條件匯編偽指令 .if.elseif/else.endif 告訴匯編器按照表達式值的 條件匯編一段代碼。 .loop/.break/.endloop 告訴匯編器按照表達式的值 循環(huán)匯編一段代碼。匯編偽指令 .global符號名1,符號名n定義全局符號,在連接 時可為其他文件使用。其作用相當于.def、.ref效果之和。 .mlib 向匯編器提供一個包含了宏定義的文檔庫的名稱。 當匯編器見到一個在當前庫中沒有定義的宏,就在.mlib 確認的宏庫中查找。7)匯編時符號定義偽指令 .asg “ character string ” substitution symb
13、ol 把字符串賦給替代符號。 .equ/.set把常數(shù)賦給符號,存放在符號表中,且不能夠 被清除。如 IMR .set 0000H。 .eval 計算一個表達式的值并把結(jié)果傳送到一個與替代 符號等同的字符串中。 .label 定義一個特殊的符號,表示段內(nèi)裝載時的地址。 .struct/.endstruct 建立一個類似C語言結(jié)構(gòu)的定義。 .tag 給類似于C的結(jié)構(gòu)特性分配一個標號。匯編偽指令8)其他匯編偽指令 .algebraic 告訴匯編器輸入文件是代數(shù)指令源代碼。 .end 結(jié)束匯編。 .mmregs 定義存儲器映射寄存器的替代符號,這樣就 可以用AR0、PMST等助記符替換實際的存儲器地
14、址。 .version 確定所用指令系統(tǒng)的DSP名。 .emsg 把用戶定義的錯誤信息發(fā)送到標準輸出設(shè)備中, 并增加錯誤計數(shù),阻止匯編器產(chǎn)生目標文件。 .mmsg 把匯編信息發(fā)送到標準輸出設(shè)備中,不設(shè)置計數(shù)。 .wmsg 把警告信息發(fā)送到標準輸出設(shè)備中,增加警告計數(shù)。匯編偽指令常用匯編偽指令 匯編偽指令匯編宏指令3.4 匯編宏指令宏語言的主要功能包括: 1)定義自己的宏和重新定義已存在的宏; 2)簡化較長的或較復雜的匯編代碼; 3)訪問歸檔器創(chuàng)建的宏庫; 4)處理一個宏中的字符串; 5)控制宏擴展列表。使用一個宏分3個過程:定義宏、調(diào)用宏和擴展宏。 1、 宏定義 在源文件的開始,或者在.inc
15、lude/.copy文件中定義宏,格式為: 宏名 .macro 形參1,形參2,形參3, 助記符指令與宏指令 .endm 在宏庫中定義宏 宏庫是由文檔管理器建立的,采用歸檔格式的文件集合。 歸檔文件(宏庫)的每一個成員可包含一個與成員名相 對應(yīng)的宏定義。可通過使用.mlib偽指令來訪宏庫。匯編宏指令匯編宏指令2、 宏調(diào)用 對宏定義的調(diào)用稱為宏調(diào)用,由一條宏指令實現(xiàn): 宏定義名 實參表 實參表中的每一項為實際參數(shù),相互之間用逗號隔開。3、宏擴展 當源程序被匯編時,匯編程序?qū)γ總€宏調(diào)用作宏展開。 宏展開就是用宏定義體取代源程序中的宏指令,而且用實 參取代宏定義中的形參。取代時實參和形參應(yīng)該一一對
16、應(yīng),即第一個實參取代第一個形參,第二個實參取代第二 個形參,依次類推。在默認的情況下,宏擴展將出現(xiàn)在列 表文件中,可通過.mnolist偽指令來關(guān)閉宏擴展清單。匯編宏指令例3-1: 宏定義、宏調(diào)用和宏展開的一個例子。* add3* ADDRP=P1+P2+P3 ;說明宏功能 add3 .macro p1,p2,p3,ADDRP ;定義宏 LD p1,A ;將參數(shù)1賦給A ADD p2,A ;將參數(shù)2與A相加 ADD p3,A ;將參數(shù)3與A相加 STL A,ADDRP ;將累加器A的低字存入?yún)?shù)4 .endm ;結(jié)束宏 .global abc,def,ghi,adr ;定義全局符號 add3
17、abc,def,ghi,adr ;調(diào)用宏 LD abc,A ;宏展開 ADD def,A ADD ghi,A STL A,adr匯編宏指令例3-2:編寫計算y=a1*x1+a2*x2+a3*x3+a4*x4 的匯編源程序* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * example.asm y=a1*x1+a2*x2+a3*x3+a4*x4 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .title “ex
18、ample.asm” .mmregs Stack .usect “STACK”,10h .bss a,4 .bss x,4 .bss y,1 .def _c_int00 .datatable: .word 1,2,3,4 .word 8,6,4,2 .text匯編宏指令_c_int00 :STM #0,SWWSR STM #stack+10h,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL SUMend: B endSUM: STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,y RET .end
19、3.5 公共目標文件格式的一般概念公共目標文件格式的一般概念 匯編器和鏈接器建立的目標文件,是一個可以在TMS320C54x器件上執(zhí)行的文件。這些目標文件的格式稱之為公共目標文件格式,即COFF(Common Object File Format)格式。 3.5.1 COFF文件中的段1、段的定義 段:連續(xù)占有存儲空間的一個數(shù)據(jù)或代碼塊。 一個目標文件中的每一個段都是分開的和各不相同的。 所有的COFF格式目標文件都至少包含以下3種 形式的段: .text 段 此段通常包含可執(zhí)行代碼; .data 段 此段通常包含初始化數(shù)據(jù); .bss 段 此段通常為未初始化變量保留存儲空間。公共目標文件格式
20、的一般概念公共目標文件格式的一般概念2、段的分類1)已初始化段 已初始化段中包含有數(shù)據(jù)或程序代碼。 .text段和.data段都是已初始化段; 用.sect匯編命令建立的自定義段也是已初始化段。2)未初始化段 作用:是為未初始化數(shù)據(jù)保留存儲空間。 .bss 段是未初始化段; 用匯編命.usect 建立的自定義段也是未初始化段。 公共目標文件格式的一般概念目標文件中的段與目標存儲器之間的關(guān)系 目標文件目標存儲器.bss.data.textRAME2PROMROM公共目標文件格式的一般概念 匯編器的任務(wù): 在匯編過程中,根據(jù)匯編命令用適當?shù)亩螌⒏鞑糠?程序代碼和數(shù)據(jù)連在一起,構(gòu)成目標文件。 匯編器
21、靠5條命令識別匯編語言程序的各個部分: .bss 末初始化段; .usect 未初始化自定義段; .text 已初始化段; .data 已初始化段; .sect 已初始化自定義段。3.5.2 匯編器對段的處理公共目標文件格式的一般概念1、未初始化段建立未初始化段的兩條命令的句法如下: .bss 符號, 字數(shù) 符號 .usect “段名” 字數(shù)對應(yīng)于保留的存儲空間第一個字的變量名稱。這個符號可以讓其他段引用,也可以用.global命令定義為全局符號。段中保留多少個存儲單元程序員為自定義未初始化段起的名字當匯編器遇到.bss或.usect命令時,并不結(jié)束當前段的匯編,只是暫時從當前段脫離出來開始對
22、新的段進行匯編。.bss和.usect命令可以出現(xiàn)在一個已初始化段的任何位置,而不會對它的內(nèi)容發(fā)生影響。 公共目標文件格式的一般概念2、已初始化段建立己初始化段的3條初始化命令的句法如下:.text 段起點.data 段起點.sect “段名” 段起點程序員為自定義未初始化段起的名字任選項。如選用,它就是為段程序計數(shù)器(SPC)定義的一個起始值。SPC值只能定義一次,而且必須在第一次遇到這個段時定義。如缺省,則SPC從0開始。當匯編器遇到.text 或.data 或.sect命令時,將停止對當前段的匯編,然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定的段中,直到再遇到另一條.text 或.data 或
23、.sect命令為止。 公共目標文件格式的一般概念3、子段子段是大段中的小段。子段命名的句法為: 基段名: 子段名例如,若要在.text段內(nèi)建立一個稱之為_func的子段,可以用如下命令: .sect “.text:_func”子段也有2種:用.sect命令建立的是已初始化段;用.usect命令建立的段是未初始化段;公共目標文件格式的一般概念4、命名段 缺省段由.text、.data和.bss命令建立,偽指令本身就 是段名; 自定義段是由.sect和.usect命令建立,需要自己定義段名; 不要把兩個偽指令當做段名; 不能用不同的偽指令處理名字相同的段。5、段程序計數(shù)器(SPC) SPC表示一個
24、程序代碼段或數(shù)據(jù)段內(nèi)當前的地址。 鏈接器在鏈接時要對每個段進行重新定位。公共目標文件格式的一般概念【例3-3】段命令應(yīng)用舉例 .title “example.asm” * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Assemble an initialized table into .data * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .datacoeff .word 011h,022h,033h* * * * * * * * * * *
25、* * * * * * * * * * * * * * * * * * Reserve space in .bss for a variable * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .bss buffer,10* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * still in .data * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ptr .word 044h.dat
26、a011h022h033h044hcoeffptr.bssbufferBuffer+1Buffer+9公共目標文件格式的一般概念* * * * * * * * * * * * * * * * * * * * * * * * Assemble code into the .text section * * * * * * * * * * * * * * * * * * * * * * * * .textadd: LD #0,DP ; 1 word LD #2,A ;1 word ADD 60H, A ;1 word* * * * * * * * * * * * * * * * * * * * *
27、 * *Another initialized table into .data * * * * * * * * * * * * * * * * * * * * * * .dataivals .word 0AAh,0BBh,0CCh* * * * * * * * * * * * * * * * * * * * * * * * * * * Define another section for more variables * * * * * * * * * * * * * * * * * * * * * * * * * *var2 .usect “newvars”,1inbuf .usect “
28、newvars”,7* * * * * * * * * * * * * * * * * * * * * * * * * * * Define a named section for int. vectors * * * * * * * * * * * * * * * * * * * * * * * * * .sect “vectors”.word 011h,033h.textLDLDADDadd.data011h022h033h044h0AAh0BBh0CChcoeffptrivalsnewvarsvar2inbufinbuf+6vectors011h033h公共目標文件格式的一般概念匯編語言
29、源程序經(jīng)過匯編后,共建立了5個段: .text段 文本段,段內(nèi)有3個字可執(zhí)行的程序代碼。 .data段 已初始化的數(shù)據(jù)段,段內(nèi)有7個字的數(shù)據(jù)。 vectors段用.sect命令生成的命名段, 段內(nèi)有2個字的 初始化數(shù)據(jù)。 .bss段 未初始化的數(shù)據(jù)段,在存儲器中為變量 保留10個存儲單元。 newvars段用.usect命令建立的命名段, 為變量保留 8個存儲單元。 .textLDLDADDadd.data011h022h033h044h0AAh0BBh0CChcoeffptrivalsvectors011h033h.bssbufferBuffer+1Buffer+9newvarsvar2in
30、bufinbuf+6公共目標文件格式的一般概念 主要功能:根據(jù)鏈接命令或鏈接命令文件(.cmd文件), 將一個或多個COFF目標文件(.obj文件) 鏈接起來,生成存儲器映象文件(.map)和 可執(zhí)行的輸出文件(.out)(COFF目標模塊)。 鏈接器建立的是絕對地址COFF文件,即.out文件注意3.5.3 鏈接器對段的處理公共目標文件格式的一般概念 兩個任務(wù): 1)把一個或多個COFF目標文件(.obj文件)中的各種段 作為鏈接器的輸入段,經(jīng)鏈接后在一個可執(zhí)行的 COFF輸出模塊中建立各個輸出段。 2)在程序裝入時對其重新定位,為各個輸出段選定 存儲器地址。 命令支持: 1) MEMORY
31、 命令。 此條命令用來定義目標系統(tǒng)的存儲器配置空間,包括對 存儲器各部分命名,以及規(guī)定它們的起始地址和長度; 2) SECTIONS 命令。 此命令告訴鏈接器如何將輸入段組合成輸出段,以及 將輸出段在存儲器中的什么位置。公共目標文件格式的一般概念1、默認的存儲器分配 在默認的方式下,鏈接器將從存儲器的0080h開始,對組合后的各段進行存儲器配置。 默認的存儲器分配過程:File1.obj.text1.data1.bss1table_1 (初始化的命名段)u_vars1 (未初始化的命名段)File2.obj.text2.data2.bss2table_2 (初始化的命名段)u_vars2 (未
32、初始化的命名段)FFT(初始化的命名段)程序存儲器數(shù)據(jù)存儲器.text.text1.text2.data.data1.data2 .bss.bss1.bss2tabletable_1table_2u_vars1u_vars1u_vars2FFTFFT沒有使用沒有配置沒有配置沒有使用公共目標文件格式的一般概念2、將段放入存儲器空間 若不采用默認的方式,通常需要建立一個鏈接命令文件,在命令文件中用MEMORY和SECTIONS偽指令定義存儲器和配置段地址。 公共目標文件格式的一般概念(1)鍵盤命令: lnk500 鏈接器會提示如下信息: Command files:Object files .ob
33、j: Output Files a.out: Options: (要求鍵入一個或多個命令文件) (要求鍵入一個或多個需要鏈接的目標文件) (要求鍵入一個鏈接器所生成的輸出文件名)(要求附加一個鏈接選項 )3.5.4 鏈接器命令文件(工程腳本文件)公共目標文件格式的一般概念(2) 鍵入命令: lnk500 file1.obj file2.obj -o link.out 在命令行中指定選項和文件名。 目標文件: file1.obj、file2.obj 命令選項: -o 輸出文件: link.out 將兩個目標文件進行鏈接,生成一個可執(zhí)行的輸出文件link.out。公共目標文件格式的一般概念(3)命
34、令文件控制方式 : lnk500 文件名 .cmd 例如:希望完成第二種命令的鏈接,在鏈接命令文件中,應(yīng)包含如下內(nèi)容: file1.obj file2.obj -o link.out 公共目標文件格式的一般概念1、鏈接器選項鏈接命令選項選 項含 義 -a 生成一個絕對地址的、可執(zhí)行的輸出模塊。所建立的絕 對地址輸出文件中不包含重新定位信息。如果既不用-a 選項,也不用-r選項,鏈接器就像規(guī)定-a選項那樣處理。 -ar 生成一個可重新定位、可執(zhí)行的目標模塊。這里采用了 -a和-r兩個選項(可以分開寫成-a -r,也可以連在一起 寫作-ar),與-a選項相比,-ar選項還在輸出文件中保留 有重新定
35、位信息。 -e global_symbol 定義一個全局符號,這個符號所對應(yīng)的程序存儲器地址, 就是使用開發(fā)工具調(diào)試這個鏈接后的可執(zhí)行文件時程序 開始執(zhí)行時的地址(稱為入口地址)。當加載器將一個程 序加載到目標存儲器時,程序計數(shù)器(PC)被初始化到入 口地址,然后從這個地址開始執(zhí)行程序。 公共目標文件格式的一般概念鏈接命令選項選 項含 義 -f fill_vale 對輸出模塊各段之間的空單元設(shè)置一個16位數(shù)值 (fill_value),如果不用-f選項,則這些空單元都置0。 -i dir 更改搜索文檔庫算法,先到dir(目錄)中搜索。此選項 必須出現(xiàn)在-l選項之前。 -l filename 命
36、名一個文檔庫文件作為鏈接器的輸入文件;filename 為文檔庫的某個文件名。此選項必須出現(xiàn)在-i選項之后。 -m filename 生成一個.map映像文件,filename是映像文件的文件名。 .map文件中說明存儲器配置、輸入、輸出段布局以及外 部符號重定位之后的地址等。 -o filename 對可執(zhí)行輸出模塊命名。如果默認,則此文件名為a.out。 -r 生成一個可重新定位的輸出模塊。當利用-r選項且不用 -a選項時,鏈接器生成一個不可執(zhí)行的文件。 公共目標文件格式的一般概念2、鏈接器命令文件格式a.obj b.obj /* 輸入文件名*/-o prog.out /* 鏈接器選項*/
37、-m prog.map /* 鏈接器選項*/MEMORY /* MEMORY 命令*/ PAGE0: ROM: origin=1000h, length=0100h PAGE1: RAM: origin=0100h, length=0100hSECTIONS /* SECTIONS 命令*/.text: ROM.data: ROM.bss: RAM輸入輸出定義描述系統(tǒng)硬件資源描述段如何定位公共目標文件格式的一般概念鏈接命令文件可包含以下內(nèi)容: (1) 輸入文件名,用來指定目標文件、存檔庫或 其他命令文件。 (2) 鏈接器選項,它們在命令文件中的使用方法 與在命令行中相同。 (3) MEMORY
38、和SECTIONS鏈接偽指令,用來指定 目標存儲器結(jié)構(gòu)和地址分配。 公共目標文件格式的一般概念注意:(1)注釋的內(nèi)容應(yīng)當用/*和*/符號括起來。 (2)如果程序中有C語言,則在cmd文件的輸入輸出部分 應(yīng)該加上:-l rts.lib語句。(3)如果程序中有C語言,則在cmd文件的輸入輸出部分 應(yīng)該加上:-c 。(4)在鏈接器命令文件中,不能采用下列符號作為段名或 符號名 align DSECT len o run ALIGN f length org RUN attr fill LENGTH origin SECTIONS ATTR FILL load ORIGIN spare block g
39、roup LOAD page type BLOCK GROUP MEMORY PAGE TYPE COPY l(小寫L) NOLOAD range UNION公共目標文件格式的一般概念3、MEMORY命令 功能: MEMORY命令用來定義目標系統(tǒng)中實際存在的并且可在程序中使用的存儲器區(qū)間,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度。注意:“MEMORY”必須大寫MEMORYPAGE 0: name 1 (attr): origin=constant, length=constantPAGE n: name n (attr): origin=constant, length=const
40、antMEMORY命令的一般句法公共目標文件格式的一般概念MEMORYPAGE 0: name 1 (attr): origin=constant, length=constantPAGE n: name n (attr): origin=constant, length=constant對一個存儲空間加以標記,每一個PAGE代表一個完全獨立的地址空間。頁號n最多可規(guī)定為255,取決于目標存儲器的配置。通常PAGE 0定為程序存儲器,PAGE 1定為數(shù)據(jù)存儲器。如果沒有規(guī)定PAGE,則鏈接器就把目標存儲器配置在PAGE 0。可以包含18個字符,AZ,az,$,.,_均可。名字并沒有特殊的含義,
41、用來標記存儲器的區(qū)間而已;不同PAGE上的存儲器區(qū)間可以取相同的名字,但在同一PAGE內(nèi)的名字不能相同,且不許重疊配置。任選項,為命名區(qū)規(guī)定14個屬性。如果有選項,應(yīng)寫在括號內(nèi)。屬性選項一共有4項:R 規(guī)定可以對存儲器執(zhí)行讀操作。W 規(guī)定可以對存儲器執(zhí)行寫操作。X 規(guī)定存儲器可以裝入可執(zhí)行的程序代碼。I 規(guī)定可以對存儲器進行初始化。沒有規(guī)定屬性的存儲器都默認有全部4項屬性。 規(guī)定一個存儲區(qū)的起始地址。鍵入origin、org或o都可以。這個值是一個16位二進制常數(shù),可以用十進制數(shù)、八進制數(shù)或十六進制數(shù)表示。 規(guī)定一個存儲區(qū)的長度,鍵入length、len或l都可以。這個值是一個16位二進制常數(shù)
42、,可以用十進制數(shù)、八進制數(shù)或十六進制數(shù)表示。 公共目標文件格式的一般概念【例3-4】用MEMORY偽指令編寫連接命令文件。要求: 程序存儲器:4K字ROM,起始地址為C00h,取名為ROM。 數(shù)據(jù)存儲器:32字RAM,起始地址為60h,取名為SCR。 512字RAM,起始地址為80h,取名為CHIP。file1.obj fiel2.obj -o Prog.out MEMORY PAGE 0: ROM: origin=C00h, length=1000h PAGE 1: SCR: origin=60h, length=20h CHIP: origin=80h, length=200h 兩個輸入文
43、件鏈接命令選項指令字頁面名稱區(qū)間名稱起始地址區(qū)間長度file1.obj fiel2.obj -o Prog.out MEMORYPAGE 0: ROM: org=C00h, len=1000hPAGE 1: SCR: org=60h, len=20h CHIP:org=80h, len=200h PAGE 0: ROM: org=C00h, len=1000h程序存儲器00000h0FFFFh00C00h1000h01C00hROMPAGE 1: SCR: org=60h, len=20h數(shù)據(jù)存儲器00000h0FFFFh00060h0007Fh20hSCR CHIP:org=80h, len
44、=200h00080h200h0027FhCHIP公共目標文件格式的一般概念公共目標文件格式的一般概念4、SECTIONS命令 SECTIONS命令的任務(wù)如下: 告訴鏈接器如何將輸入段組合成輸出段 在可執(zhí)行程序中定義輸出段 規(guī)定輸出段在存儲器中的存放位置 允許重新命名輸出項。SECTIONSname:property,property,property,name:property,property,property,name:property,property,property,SECTIONS命令的一般句法 性能參數(shù)段名注意:SECTIONS命令用大寫字母,緊隨其后并用大括號括起來的是關(guān)于輸
45、出段的詳細說明。公共目標文件格式的一般概念性能參數(shù)包括 :1)load allocation: 定義將輸出段加載到存儲器中的什么位置。 句法: load=allocation 或者 allocation 或者 allocation其中allocation是關(guān)于輸出段地址的說明,即給輸出段分配的存儲單元的首地址。 公共目標文件格式的一般概念多種書寫形式:.text:load=0 x1000 將.text段定位到一個特定地址。.text:ROM 將.text段定位到名為ROM的存儲區(qū)。.bss:(RW) 將.bss段定位到屬性為R,W的存儲區(qū)。.text:align=0 x80 將.text定位到
46、0 x80開始的存儲區(qū)。.bss:load=block(0 x80)將.bss定位到一個n字存儲器塊的 任何一個位置(n為 2的冪次)。.text: PAGE 0 將輸出段.text定位到PAGE 0。如果要用到一個以上參數(shù),可以將它們排成一行,如:.text:ROM align (16) PAGE(2) 也可用括號括起來:.text: load=(ROM align (16) PAGE(2) 公共目標文件格式的一般概念2)Run allocation: 用來定義輸出段在存儲器的什么位置上開始運行。 句法: run=allocation 或者: runallocation注意:鏈接器為段在目標
47、存儲器中分配兩個地址: 加載程序的地址由裝入存儲器分配完成 執(zhí)行程序的地址由運行存儲器分配完成若要想把程序的加載區(qū)分開,則用SECTIONS命令讓鏈接器對這個段定位兩次即可。 例如: .text: load=ROM,run=RAM 公共目標文件格式的一般概念3)Input sections:用來定義由哪些輸入段組成輸出段。 句法:input_sections 大多數(shù)情況下,在SECTIONS命令中是不列出每個輸入文件的輸入段的段名的: SECTIONS .text: .data: .bss 公共目標文件格式的一般概念用文件名和段名來明確地規(guī)定輸入段,其格式如下:SECTIONS .text:
48、/* 建立 .text 輸出段 */ f1.obj(.text) /* 鏈接源于f1.obj的.text段*/ f2.obj(sec1) /*鏈接源于f2.obj的sec1段*/ f3.obj /*鏈接源于f3.obj的所有段*/ f4.obj(.text,sec2) /*鏈接源于f4.obj的.text段和sec2段 */ 4) 段的類型用于為輸出段定義特殊形式的標記 。語法格式: type=COPY 或 type=DSECT 或 type=NOLOAD 5) 充填值用于對未初始化空單元定義一個數(shù)值。語法格式: fill=value 或 name:=value公共目標文件格式的一般概念公共目
49、標文件格式的一般概念【例3-5】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h t1.obj(.int1) t2.obj(.int2) .data: load=RAM 兩個輸入文件鏈接命令選項指令字輸出段說明語句公共目標文件格式的一般概念【例3-5】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM
50、,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h t1.obj(.int1) t2.obj(.int2) .data: load=RAM 輸出段加載地址運行地址.textROMRAM 800h.conROM.bssRAM.vec ROM FF80.data RAM公共目標文件格式的一般概念【例3-5】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec:
51、load=FF80h t1.obj(.int1) t2.obj(.int2) .data: load=RAM 輸出段加載地址運行地址.textROMRAM 800h.conROM.bssRAM.vec ROM FF80.data RAM ROM RAM00h.text.con.bss.vec.dataFF80h運行時800h.text.text.text公共目標文件格式的一般概念5、MEMORY和SECTIONS命令的默認算法MEMORYPAGE 0: PROG: origin=0 x0080, length=0 xFF00PAGE 1: DATA: origin=0 x0080, lengt
52、h=0 xFF80SECTIONS.text: PAGE=0.data: PAGE=0.cinit: PAGE=0.bss: PAGE=1 公共目標文件格式的一般概念例3-6 鏈接器對段的處理應(yīng)用舉例: .title “example.asm” .datacoeff .word 011h,022h,033h .bss buffer,10ptr .word 044h .textadd: LD #0,DP ; 1 word LD #2,A ;1 word ADD 60H, A ;1 word .dataivals .word 0AAh,0BBh,0CChvar2 .usect “newvars”,
53、1inbuf .usect “newvars”,7 .sect “vectors” .word 011h,033h公共目標文件格式的一般概念/* example.cmd */-o example.out-m example.mapMEMORY PAGE 0: EPROM: org=0E000h, len=100h VECS: org=0FF80h, len=04h PAGE 1: SPRAM: org=0060h, len=20h DARAM: org=0080h, len=100hSECTIONS .text: EPROM PAGE 0 .data: EPROM PAGE 0 .bss: S
54、PRAM PAGE 1 newvars: DARAM PAGE 1 vectors: VECS PAGE 0公共目標文件格式的一般概念.data011h022h033h044h0AAh0BBh0CChcoeffptrivals.bssbufferBuffer+1Buffer+9vectors011h033hnewvarsvar2inbufinbuf+6.textLDLDADDadd公共目標文件格式的一般概念程序存儲器0000HFFFFHE000HE0FFHEPROM數(shù)據(jù)存儲器0000HFFFFH60H7FHSPRAM80H17FHDARAMFF80HFF83HVECS.text.datavec
55、tors.bssnewvarsC語言程序設(shè)計概述3.6 C 語言程序設(shè)計概述.cmd文件的輸入輸出定義部分必須包含語句: -lrts.lib狀態(tài)位名稱預(yù)設(shè)值是否可在C中修改ARP輔助寄存器指針0是ASM累加器移位模式是BRAF塊重復激活位否C進位位是C16雙16位模式0否CMPT兼容模式位0否CPL編譯模式位1否FRCT小數(shù)模式位0否OVA累加器A溢出標志是OVB累加器A溢出標志是OVM溢出模式0指令有效SXM符號擴展模式是SMUL飽和/乘法控制位指令有效SST飽和/存儲控制位0否TC測試控制位是3.6.1 數(shù)據(jù)類型數(shù)據(jù)類型字長/位表示形式最小值最大值signed char16ASCII-32
56、76832767char,unsigned char16ASCII065535short,signed short16二進制補碼-3276832767unsigned short16二進制065535int,signed int16二進制補碼-3276832767unsigned int16二進制065535long,signed long32二進制補碼-21474836482147483647unsigned long32二進制04294967295enum16二進制補碼-3276832767float32IEEE 32-bit1.175494e-383.40282346e+38double
57、32IEEE 32-bit1.175494e-383.40282346e+38long double32IEEE 32-bit1.175494e-383.40282346e+38pointers16二進制00 xFFFFC語言程序設(shè)計概述C語言程序設(shè)計概述1、常量使用C語言中const關(guān)鍵字或采用宏定義的方法定義常量。不能使用C語言的關(guān)鍵字作為常量名,常量名以字母或下劃線開頭,最多可以有100個字符。2、變量變量名應(yīng)符合C語言關(guān)于變量名的要求,注意不能使用C語言的關(guān)鍵字作為變量名,應(yīng)以字母或下劃線開頭,變量名最長可以有100個字符。C語言程序設(shè)計概述4、volatile類型變量在編寫C語言程序
58、時,如果存在一些依賴于存儲區(qū)訪問的代碼,則需要使用關(guān)鍵字volatile來確定這些訪問,這樣就可以使這些代碼不參與代碼優(yōu)化,從而保證了程序按照最基本的功能執(zhí)行。3、端口變量端口變量在C54x中的定義格式為:ioport type porthex_num在使用端口變量的時候,需要注意如下幾點:1)必須在文件中聲明,不能在函數(shù)中使用關(guān)鍵字ioport。2)可以用于程序中的幅值、計算等語句。3)在函數(shù)調(diào)用的時候,端口變量采用的是傳遞數(shù)值方式而 不是傳遞地址方式,即傳送到是數(shù)值而不是地址。 1、局部變量和全局變量局部變量:只在本函數(shù)范圍內(nèi)有效,也只有在函數(shù)內(nèi) 才能使用的變量;全局變量:在函數(shù)之外定義、
59、有效范圍是從定義變量 的位置開始到文件結(jié)束的變量。 C語言程序設(shè)計概述3.6.2 變量的作用域和生存期C語言程序設(shè)計概述2、動態(tài)存儲變量和靜態(tài)存儲變量 靜態(tài)存儲區(qū)保存全局變量,程序開始執(zhí)行時分配空間, 程序執(zhí)行完畢釋放空間。 動態(tài)存儲區(qū)保存函數(shù)調(diào)用時的形式參數(shù)變量、現(xiàn)場保護 和返回地址等,還有未加static說明的局部變量。 這些數(shù)據(jù),在函數(shù)調(diào)用開始時分配空間,函數(shù)結(jié)束時 釋放空間。 對數(shù)據(jù)和函數(shù)的存儲類別具體劃分,可以分為四種: 自動的(auto) 靜態(tài)的(static) 寄存器的(register) 外部的(extern)。C語言程序設(shè)計概述1)自動的(auto) 任何一個文件中定義的數(shù)據(jù)
60、和函數(shù),缺省類型都是auto。2)靜態(tài)的(static)static type varid;3)寄存器的(register) register type regid4)外部的(extern) 如果數(shù)據(jù)或函數(shù)在另外的文件中定義,則在使用文件中該數(shù)據(jù)應(yīng)申明是extern。C語言程序設(shè)計概述1、已初始化段包括:.text: 存放C程序代碼,放在ROM和RAM中均可, 一般屬于Page0。.switch:存放C程序中switch語句產(chǎn)生的跳轉(zhuǎn)地址表。 放在ROM和RAM中均可,一般屬于Page0。.cinit: 存放C程序中變量的初始值和常量,放在 ROM和RAM中均可,一般屬于Page0。.cons
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國鋁粉功能材料行業(yè)市場競爭現(xiàn)狀及未來前景預(yù)測研究報告
- 烹飪學校的師徒結(jié)對心得體會
- DB62T 4174-2020 玉米品種 原玉甜503
- 湘教版九年級上冊美術(shù)課堂管理計劃
- 非營利組織工作人員師徒結(jié)對的經(jīng)驗教訓
- 市場分析報告范文
- 企業(yè)培訓教務(wù)人員流程與職責
- 信息技術(shù)項目安全生產(chǎn)職責
- 硬膜下水腫的護理查房
- 企業(yè)盈利質(zhì)量與未來盈利能力分析以A工程機械股份有限公司為例
- 2025-2030年輪椅行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025年中國諧波測量儀器市場調(diào)查研究報告
- 無人機操作考試及其理論試題和答案
- 駐村第一書記工作總結(jié)模版
- 2025物理大一輪復習講義復習講義答案精析
- 2025年高考政治搶押秘籍(江蘇專用)時政熱點04哪吒2(學生版+解析)
- 廣東省深圳市2025年中考模擬歷史試題四套附參考答案
- 粵語知識測試題及答案
- 第23課《“蛟龍”探海》課件統(tǒng)編版語文七年級下冊
- 2025年北京市東城區(qū)初三語文一模作文《根基》寫作指導+范文
評論
0/150
提交評論