第七章偽指令和宏語(yǔ)言_目標(biāo)文件連接_第1頁(yè)
第七章偽指令和宏語(yǔ)言_目標(biāo)文件連接_第2頁(yè)
第七章偽指令和宏語(yǔ)言_目標(biāo)文件連接_第3頁(yè)
第七章偽指令和宏語(yǔ)言_目標(biāo)文件連接_第4頁(yè)
第七章偽指令和宏語(yǔ)言_目標(biāo)文件連接_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1偽指令偽指令 TMS320C2000/C5X的匯編偽指令可以實(shí)現(xiàn)以下功能:的匯編偽指令可以實(shí)現(xiàn)以下功能: 匯編代碼和數(shù)據(jù)到指定的段;匯編代碼和數(shù)據(jù)到指定的段; 為未定義的變量保存空間;為未定義的變量保存空間; 控制列表文件;控制列表文件; 分配存儲(chǔ)器;分配存儲(chǔ)器; 匯編條件塊;匯編條件塊; 定義全局變量;定義全局變量; 指定匯編器能得到的宏;指定匯編器能得到的宏; 檢查符號(hào)調(diào)試信息。檢查符號(hào)調(diào)試信息。7. 1 偽指令偽指令分為分為8類:類: 段定義偽指令:段定義偽指令:把匯編語(yǔ)句程序的各部分與適當(dāng)?shù)亩温?lián)系起來(lái)。把匯編語(yǔ)句程序的各部分與適當(dāng)?shù)亩温?lián)系起來(lái)。 .bes, .bss, .data,

2、.text, .sect, .usect,.sblock。初始化常數(shù)偽指令:初始化常數(shù)偽指令:為當(dāng)前段匯編數(shù)值。為當(dāng)前段匯編數(shù)值。 .space, .byte, .field, .float, .xfloat, .int, .word, .long, .xlong, .pstring,string。段程序計(jì)數(shù)器排列偽指令:段程序計(jì)數(shù)器排列偽指令: 使段程序計(jì)數(shù)器使段程序計(jì)數(shù)器SPC指向預(yù)定的位置。指向預(yù)定的位置。 align, .even。 輸出列表格式偽指令:輸出列表格式偽指令:控制列表文件的格式??刂屏斜砦募母袷?。 .drlist, .drnolist, .fclist, .fcnoli

3、st, .length, .width,.list,.nolist, .mlist, .mnolist, .option, .page, .sslist, .ssnolist, .tab, .title。引用其他文件偽指令:引用其他文件偽指令:為文件提供信息或提供這些文件的信息。為文件提供信息或提供這些文件的信息。. .copy, .include, .global, .def, .ref, .mlib。條件匯編偽指令:條件匯編偽指令:使匯編器根據(jù)表達(dá)式求值結(jié)果的真或假來(lái)匯編代碼的某些段。使匯編器根據(jù)表達(dá)式求值結(jié)果的真或假來(lái)匯編代碼的某些段。 .if, .elseif, .else, .end

4、if, .loop, .break, .endloop。匯編時(shí)的符號(hào)偽指令:匯編時(shí)的符號(hào)偽指令:使定義的符號(hào)名等同于常數(shù)值或字符串。使定義的符號(hào)名等同于常數(shù)值或字符串。 .asg, .eval, .set, .equ, .struct, .endstruct,.label 。 匯編模式偽指令:匯編模式偽指令:定義在定義在C28x 或認(rèn)可或認(rèn)可C2xLP模式。模式。.c28_amode, .lp_amode。其他偽指令:其他偽指令:具有其他功能和特性的偽指令。具有其他功能和特性的偽指令。 .end, .mmregs, .newblock, .port, .sblock, .version, .e

5、msg, .wmsg。7. 2 宏指令宏指令 將頻繁出現(xiàn)的程序段定義為宏指令,將頻繁出現(xiàn)的程序段定義為宏指令, 當(dāng)程序中需要執(zhí)行該程序段時(shí),只需用一條宏調(diào)用語(yǔ)句。當(dāng)程序中需要執(zhí)行該程序段時(shí),只需用一條宏調(diào)用語(yǔ)句。 縮短源程序的長(zhǎng)度,使源程序易讀,減少了書(shū)寫(xiě)錯(cuò)誤??s短源程序的長(zhǎng)度,使源程序易讀,減少了書(shū)寫(xiě)錯(cuò)誤。1)定義宏:)定義宏:用戶在使用宏之前必須先定義宏。在程序的任何地方都可以定義一用戶在使用宏之前必須先定義宏。在程序的任何地方都可以定義一 個(gè)宏??稍谠次募_(kāi)始處或者在個(gè)宏??稍谠次募_(kāi)始處或者在.include/.copy文件中或者在宏庫(kù)中定義。文件中或者在宏庫(kù)中定義。格式:格式: 宏名

6、宏名 .macro 形式參數(shù)形式參數(shù)1,形式參數(shù),形式參數(shù)2,形式參數(shù),形式參數(shù)n 宏體宏體 .mexit .endm宏名宏名 用通常規(guī)定的字符串格式書(shū)寫(xiě)。用通常規(guī)定的字符串格式書(shū)寫(xiě)。.mexit 相當(dāng)于相當(dāng)于“goto .endm”,用于條件判斷后的轉(zhuǎn)移,可缺省。,用于條件判斷后的轉(zhuǎn)移,可缺省。形式參數(shù)形式參數(shù) 或稱為替代符號(hào)。同樣按通常規(guī)定的字符串格式書(shū)寫(xiě)。替代符或稱為替代符號(hào)。同樣按通常規(guī)定的字符串格式書(shū)寫(xiě)。替代符 號(hào)作為宏參數(shù)僅在被定義的宏中有效。號(hào)作為宏參數(shù)僅在被定義的宏中有效。 每個(gè)宏最多可以用每個(gè)宏最多可以用32個(gè)宏參數(shù)。個(gè)宏參數(shù)。 宏可以嵌套,但宏的所有元素都應(yīng)在同一個(gè)文件中定

7、義。宏可以嵌套,但宏的所有元素都應(yīng)在同一個(gè)文件中定義。7. 2 宏指令宏指令(2)調(diào)用宏:)調(diào)用宏:在定義了宏以后,就可以在源程序中將宏的名字作為操作碼來(lái)調(diào)用。在定義了宏以后,就可以在源程序中將宏的名字作為操作碼來(lái)調(diào)用。 格式:格式: 宏名宏名 實(shí)參數(shù)實(shí)參數(shù)1,實(shí)參數(shù),實(shí)參數(shù)2,實(shí)參數(shù),實(shí)參數(shù)n,7 . 2 宏指令宏指令(3)展開(kāi)宏:)展開(kāi)宏:匯編器在對(duì)源文件進(jìn)行匯編時(shí),對(duì)調(diào)用的宏進(jìn)行展開(kāi)。在展開(kāi)匯編器在對(duì)源文件進(jìn)行匯編時(shí),對(duì)調(diào)用的宏進(jìn)行展開(kāi)。在展開(kāi)過(guò)程中,匯編器用宏體取代宏調(diào)用語(yǔ)句,宏體中的形式參數(shù)實(shí)際參數(shù)代替。過(guò)程中,匯編器用宏體取代宏調(diào)用語(yǔ)句,宏體中的形式參數(shù)實(shí)際參數(shù)代替。 如果某個(gè)形式

8、參數(shù)沒(méi)有對(duì)應(yīng)的實(shí)參數(shù)為其賦值,該形式參數(shù)將被空串如果某個(gè)形式參數(shù)沒(méi)有對(duì)應(yīng)的實(shí)參數(shù)為其賦值,該形式參數(shù)將被空串 (“ ”)代替。)代替。 如果實(shí)參數(shù)的個(gè)數(shù)多于形式參數(shù),則余下的實(shí)參數(shù)將賦給最后一個(gè)形式如果實(shí)參數(shù)的個(gè)數(shù)多于形式參數(shù),則余下的實(shí)參數(shù)將賦給最后一個(gè)形式 參數(shù)(用逗號(hào)隔開(kāi))。參數(shù)(用逗號(hào)隔開(kāi))。 如果要把一串變量賦給一個(gè)形式參數(shù),或者把一個(gè)逗號(hào)(或分號(hào))傳如果要把一串變量賦給一個(gè)形式參數(shù),或者把一個(gè)逗號(hào)(或分號(hào))傳 給一個(gè)形式參數(shù),就必須用引號(hào)將它們引起來(lái)。給一個(gè)形式參數(shù),就必須用引號(hào)將它們引起來(lái)。 匯編時(shí),匯編器先用實(shí)參數(shù)代替形式參數(shù)并展開(kāi)宏,然后把源語(yǔ)句匯編匯編時(shí),匯編器先用實(shí)參數(shù)代

9、替形式參數(shù)并展開(kāi)宏,然后把源語(yǔ)句匯編 為目標(biāo)代碼,并輸出到列表文件中。為目標(biāo)代碼,并輸出到列表文件中。,7 . 2 宏指令宏指令例例6.23 宏定義:宏定義: parms .macro x,y,za=xb=yc=z.endm 調(diào)用宏:調(diào)用宏: 匯編時(shí)展開(kāi)宏:匯編時(shí)展開(kāi)宏: parms 100,200 ;a=100 ;b=200 ;c=“ ” parms“100,200,300”,55,66,77 ;a=“100,200,300” ;b=55 ;c=66,77 .C C源文件源文件 .ASM 匯編文件匯編文件 .CMD 命令文件命令文件 .H 頭文件頭文件 .PRJ 工程文件工程文件 .LST

10、列表文件列表文件 .MAP 映射文件映射文件 .OBJ目標(biāo)文件目標(biāo)文件 .OUT 可執(zhí)行文件可執(zhí)行文件 7 .4 目標(biāo)文件鏈接目標(biāo)文件鏈接DSP系統(tǒng)中常用的文件后系統(tǒng)中常用的文件后綴綴 COFF目標(biāo)文件總是包括目標(biāo)文件總是包括3個(gè)默認(rèn)的段個(gè)默認(rèn)的段 : 文本段:文本段:用用.text定義,通常包括可執(zhí)行代碼。定義,通常包括可執(zhí)行代碼。 數(shù)據(jù)段:數(shù)據(jù)段:用用.data定義,通常包括已定義,通常包括已初始化的初始化的數(shù)據(jù)。數(shù)據(jù)。 預(yù)留段:預(yù)留段:用用.bss定義,通常定義,通常保留保留用于用于未初始化變量的空間未初始化變量的空間。段段 7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接目目標(biāo)文件的最小單位被稱為標(biāo)文

11、件的最小單位被稱為段段,它是在存儲(chǔ)器中占有連,它是在存儲(chǔ)器中占有連續(xù)空間的續(xù)空間的代碼塊或數(shù)據(jù)塊代碼塊或數(shù)據(jù)塊。u 匯匯編器在匯編過(guò)程中建立這些段,鏈接器把段編器在匯編過(guò)程中建立這些段,鏈接器把段重定位重定位到目標(biāo)存儲(chǔ)器中到目標(biāo)存儲(chǔ)器中u 所有的段都是獨(dú)立的、可定位的所有的段都是獨(dú)立的、可定位的u 相同的段將按相同的段將按先后先后次序定位在連續(xù)的區(qū)域內(nèi)次序定位在連續(xù)的區(qū)域內(nèi)u 未初始化段未初始化段被定位到被定位到RAM內(nèi);內(nèi);初始化段初始化段可單獨(dú)定位在可單獨(dú)定位在RAM或或ROM內(nèi),內(nèi), 并且在鏈接并且在鏈接時(shí)時(shí),還還可引用其他段內(nèi)定義的符號(hào)可引用其他段內(nèi)定義的符號(hào) 匯編器為每個(gè)匯編器為每個(gè)

12、段段設(shè)置了一個(gè)設(shè)置了一個(gè)獨(dú)立的獨(dú)立的程序計(jì)數(shù)器,這些計(jì)數(shù)器稱為程序計(jì)數(shù)器,這些計(jì)數(shù)器稱為段程序段程序計(jì)數(shù)器計(jì)數(shù)器(SPC,Section Program Counters)。)。 可以用段程序計(jì)數(shù)器可以用段程序計(jì)數(shù)器排列排列偽指令偽指令.align或或.even,強(qiáng)迫,強(qiáng)迫SPC指向預(yù)定的位置。指向預(yù)定的位置。段段 段程序計(jì)數(shù)器段程序計(jì)數(shù)器 7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接 鏈接器鏈接器通過(guò)鏈接通過(guò)鏈接COFF目標(biāo)文件建立可目標(biāo)文件建立可 執(zhí)行文件,執(zhí)行文件, 目標(biāo)文件中的目標(biāo)文件中的段段是鏈接時(shí)的重要依據(jù)。是鏈接時(shí)的重要依據(jù)。 鏈接器可把鏈接器可把段段定位到用戶系定位到用戶系 統(tǒng)已配置的存儲(chǔ)

13、器中。統(tǒng)已配置的存儲(chǔ)器中。 鏈接器命令文件(鏈接器命令文件(.cmd)則給出鏈接器在鏈接時(shí)的有關(guān)信息則給出鏈接器在鏈接時(shí)的有關(guān)信息 DSP芯片的存儲(chǔ)器配置隨應(yīng)用的不同而不同芯片的存儲(chǔ)器配置隨應(yīng)用的不同而不同.用鏈接器偽指令用鏈接器偽指令 MEMORY(存儲(chǔ)器偽指令)可以確定目標(biāo)系統(tǒng)的各種內(nèi)存配置。(存儲(chǔ)器偽指令)可以確定目標(biāo)系統(tǒng)的各種內(nèi)存配置。 當(dāng)當(dāng)MEMORY決定了存儲(chǔ)器模式后,可以用鏈接器偽指令決定了存儲(chǔ)器模式后,可以用鏈接器偽指令SECTIONS (段偽指令)確定鏈接器組合輸入段的方法和輸出段在存儲(chǔ)器中的位置。(段偽指令)確定鏈接器組合輸入段的方法和輸出段在存儲(chǔ)器中的位置。 如果不使用這

14、兩條偽指令,鏈接器則用默認(rèn)存儲(chǔ)器的定位方式來(lái)組合段,如果不使用這兩條偽指令,鏈接器則用默認(rèn)存儲(chǔ)器的定位方式來(lái)組合段, 并把它們定位到存儲(chǔ)器中。并把它們定位到存儲(chǔ)器中。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件鏈接器命令文件和和鏈接器偽指令鏈接器偽指令鏈接時(shí)給符號(hào)賦值鏈接時(shí)給符號(hào)賦值 賦值語(yǔ)句的語(yǔ)法:賦值語(yǔ)句的語(yǔ)法:鏈接器中賦值語(yǔ)句的語(yǔ)法類似于鏈接器中賦值語(yǔ)句的語(yǔ)法類似于C語(yǔ)言中賦值語(yǔ)句語(yǔ)言中賦值語(yǔ)句語(yǔ)法。語(yǔ)法。 符號(hào)符號(hào) = 表達(dá)式表達(dá)式 ;把表達(dá)式的值賦予符號(hào);把表達(dá)式的值賦予符號(hào) 符號(hào)符號(hào) += 表達(dá)式表達(dá)式 ;把表達(dá)式的值加到符號(hào)上;把表達(dá)式的值加到符號(hào)上 符號(hào)符號(hào) -= 表達(dá)式表達(dá)

15、式 ;從符號(hào)減去表達(dá)式的值;從符號(hào)減去表達(dá)式的值 符號(hào)符號(hào) *= 表達(dá)式表達(dá)式;符號(hào)乘以表達(dá)式;符號(hào)乘以表達(dá)式 符號(hào)符號(hào) /= 表達(dá)式表達(dá)式;符號(hào)除以表達(dá)式;符號(hào)除以表達(dá)式 把把SPC賦予符號(hào)賦予符號(hào)“.”:“.”表示定位期間表示定位期間SPC的當(dāng)前值。的當(dāng)前值?!?”符號(hào)符號(hào)僅僅可用可用在在 SECTIONS偽指令內(nèi)的賦值語(yǔ)句中,用來(lái)表示段的當(dāng)前運(yùn)行地址。偽指令內(nèi)的賦值語(yǔ)句中,用來(lái)表示段的當(dāng)前運(yùn)行地址。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 賦值表達(dá)式:鏈接器表達(dá)式必須遵循以下規(guī)則:賦值表達(dá)式:鏈接器表達(dá)式必須遵循以下規(guī)則: 表達(dá)式可包含全局

16、符號(hào)、常數(shù),以及表達(dá)式可包含全局符號(hào)、常數(shù),以及表表7-3-1所列的所列的C語(yǔ)言運(yùn)算符。語(yǔ)言運(yùn)算符。 所有數(shù)被當(dāng)做長(zhǎng)整數(shù)(所有數(shù)被當(dāng)做長(zhǎng)整數(shù)(32位)處理。位)處理。 鏈接器用和匯編器相同的方式識(shí)別常數(shù)鏈接器用和匯編器相同的方式識(shí)別常數(shù)。見(jiàn)見(jiàn)表表7-3-2. 表表達(dá)式中的符號(hào)只具有符號(hào)的地址值,不進(jìn)行類型檢查。達(dá)式中的符號(hào)只具有符號(hào)的地址值,不進(jìn)行類型檢查。 鏈接器表達(dá)式可以是絕對(duì)的或可重定位的。鏈接器表達(dá)式可以是絕對(duì)的或可重定位的。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 MEMORY偽指令偽指令 確定在目標(biāo)系統(tǒng)中具有確定在目標(biāo)系統(tǒng)中具有物理位

17、置物理位置,且且可被程序使用的可被程序使用的存儲(chǔ)器范圍存儲(chǔ)器范圍。MEMORY偽指令的一般語(yǔ)句形式為:偽指令的一般語(yǔ)句形式為:MEMORY PAGE 0: 存儲(chǔ)器名存儲(chǔ)器名1(屬性)(屬性):ORIGIN=常數(shù)常數(shù), LENGTH=常數(shù)常數(shù) PAGE n: 存儲(chǔ)器名存儲(chǔ)器名n(屬性)(屬性): ORIGIN=常數(shù)常數(shù),LENGTH=常數(shù)常數(shù) 7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令PAGE: 定義一個(gè)存儲(chǔ)器空間,用戶可以定義多達(dá)定義一個(gè)存儲(chǔ)器空間,用戶可以定義多達(dá)255頁(yè)。頁(yè)。 PAGE0定義定義程序存儲(chǔ)器程序存儲(chǔ)器,PAGE1定義定義數(shù)據(jù)存儲(chǔ)器

18、數(shù)據(jù)存儲(chǔ)器, 2812只有只有這兩個(gè)頁(yè)這兩個(gè)頁(yè)。如果用戶沒(méi)有使用如果用戶沒(méi)有使用PAGE選項(xiàng),那么鏈接器把段定位到選項(xiàng),那么鏈接器把段定位到PAGE0。每個(gè)每個(gè)PAGE代表一個(gè)完全獨(dú)立的地址空間。代表一個(gè)完全獨(dú)立的地址空間。在在PAGE0上已配置的存儲(chǔ)器可以和在上已配置的存儲(chǔ)器可以和在PAGE1上已配置的存儲(chǔ)器重疊。上已配置的存儲(chǔ)器重疊。存儲(chǔ)器名:存儲(chǔ)器名: 命名存儲(chǔ)器范圍。由命名存儲(chǔ)器范圍。由18個(gè)字符組成。個(gè)字符組成。名字對(duì)于鏈接器沒(méi)有特殊的意義,僅指明存儲(chǔ)器的區(qū)域。名字對(duì)于鏈接器沒(méi)有特殊的意義,僅指明存儲(chǔ)器的區(qū)域。在不同頁(yè)上存儲(chǔ)器范圍可以有相同的名字,在不同頁(yè)上存儲(chǔ)器范圍可以有相同的名字

19、,在同一頁(yè),所有的存儲(chǔ)器范圍在同一頁(yè),所有的存儲(chǔ)器范圍不能不能有有相同相同的名字,且的名字,且不能重疊不能重疊。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令屬性:屬性:可選項(xiàng),當(dāng)被使用時(shí),必須用括號(hào)括起來(lái)。屬性把輸出段的定位限制在某可選項(xiàng),當(dāng)被使用時(shí),必須用括號(hào)括起來(lái)。屬性把輸出段的定位限制在某 些存儲(chǔ)器范圍內(nèi)。些存儲(chǔ)器范圍內(nèi)。如果如果用戶不使用任何屬性,用戶不使用任何屬性,則則輸出段即可以輸出段即可以定位到定位到任何任何 范圍內(nèi)。有效的屬性包括:范圍內(nèi)。有效的屬性包括:R存儲(chǔ)器可讀;存儲(chǔ)器可讀; W存儲(chǔ)器可寫(xiě);存儲(chǔ)器可寫(xiě); X儲(chǔ)器可以包含可執(zhí)行代碼

20、;儲(chǔ)器可以包含可執(zhí)行代碼; I存儲(chǔ)器可被初始化。存儲(chǔ)器可被初始化。ORIGIN:指定存儲(chǔ)器的起始地址,也可以寫(xiě)成指定存儲(chǔ)器的起始地址,也可以寫(xiě)成org或或o。這個(gè)值是以字節(jié)規(guī)定。這個(gè)值是以字節(jié)規(guī)定 的的16位常數(shù),也可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制。位常數(shù),也可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制。 LENGTH:指定存儲(chǔ)器的長(zhǎng)度指定存儲(chǔ)器的長(zhǎng)度,也可以寫(xiě)成也可以寫(xiě)成len或或l。數(shù)值的表示與。數(shù)值的表示與origin相同相同 當(dāng)用戶使用當(dāng)用戶使用MEMORY偽指令時(shí)偽指令時(shí),要確信已指定了所有可要確信已指定了所有可 用于裝載代碼的存儲(chǔ)器范圍。用于裝載代碼的存儲(chǔ)器范圍。 鏈接器鏈接器不不把程序把程序放到

21、放到未配置的存儲(chǔ)器中。未配置的存儲(chǔ)器中。注意:注意:7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令例例6.24 MEMORY指令舉例指令舉例 / * Sample Command file with MEMORY directive * /file1.obj file2.obj -o prog.out MEMORY PAGE0: ROM: ORIGIN=0C00h ,LENGTH=1000h PAGE1: SCRATCH: ORIGIN =60h, LENGTH =20h RAM: ORIGIN =200h, LENGTH =200h 該例定義了一個(gè)存

22、儲(chǔ)器系統(tǒng):具有程序存儲(chǔ)器中地址為該例定義了一個(gè)存儲(chǔ)器系統(tǒng):具有程序存儲(chǔ)器中地址為0C00h,長(zhǎng)度為,長(zhǎng)度為4K字字的的ROM;數(shù)據(jù)存儲(chǔ)器中地址為;數(shù)據(jù)存儲(chǔ)器中地址為60h,長(zhǎng)度為,長(zhǎng)度為32字字的的RAM;數(shù)據(jù)存儲(chǔ)器;數(shù)據(jù)存儲(chǔ)器中地址為中地址為200h,長(zhǎng)度為長(zhǎng)度為512字字的的RAM。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 SECTIONS偽指令偽指令 描述描述輸入段怎樣被輸入段怎樣被組合到組合到輸出段內(nèi);定義在執(zhí)行程序中的輸出段;輸出段內(nèi);定義在執(zhí)行程序中的輸出段; 規(guī)定輸出段規(guī)定輸出段在存儲(chǔ)器中在存儲(chǔ)器中的位置;允許重新命名輸出段。的位置

23、;允許重新命名輸出段。SECTIONS偽指令的一般語(yǔ)法形式是:偽指令的一般語(yǔ)法形式是:SECTIONS 段名段名1:特性特性1,特性,特性2, 段名段名2:特性特性1,特性,特性2, 指令中的每一行從段名開(kāi)始定義輸出段,輸出段是輸出文件內(nèi)的段。指令中的每一行從段名開(kāi)始定義輸出段,輸出段是輸出文件內(nèi)的段。在段名之后是特性列表(以在段名之后是特性列表(以逗號(hào)逗號(hào)隔開(kāi))隔開(kāi)),定義段的內(nèi)容以及它是怎樣被分配的。定義段的內(nèi)容以及它是怎樣被分配的。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令特性列表的選項(xiàng)(段所具備的特性)有以下幾種。特性列表的選項(xiàng)(段所具備的

24、特性)有以下幾種。 裝載地址:裝載地址:規(guī)定段將被裝載在存儲(chǔ)器中的位置。規(guī)定段將被裝載在存儲(chǔ)器中的位置。 語(yǔ)法:語(yǔ)法:load = allocation 或或 allocation 或或 allocation allocation是是MEMORY偽指令所定義的范圍內(nèi)地址。偽指令所定義的范圍內(nèi)地址。 運(yùn)行地址:運(yùn)行地址:定義段在存儲(chǔ)器內(nèi)運(yùn)行的位置。定義段在存儲(chǔ)器內(nèi)運(yùn)行的位置。 語(yǔ)法:語(yǔ)法:run = allocation 或或 run allocation 如果在一個(gè)段中如果在一個(gè)段中 load 和和 run 的地址相同,的地址相同, run 可以省略??梢允÷?。 鏈接器為每個(gè)輸出段分配兩個(gè)目標(biāo)

25、存儲(chǔ)器地址:裝載地址和運(yùn)行地址。鏈接器為每個(gè)輸出段分配兩個(gè)目標(biāo)存儲(chǔ)器地址:裝載地址和運(yùn)行地址。通通常這兩個(gè)地址是相同的常這兩個(gè)地址是相同的。但有時(shí)用戶可能把代碼裝入存儲(chǔ)器的一個(gè)區(qū)域卻在另。但有時(shí)用戶可能把代碼裝入存儲(chǔ)器的一個(gè)區(qū)域卻在另一個(gè)區(qū)域運(yùn)行它。例如在引導(dǎo)加載程序,用一個(gè)區(qū)域運(yùn)行它。例如在引導(dǎo)加載程序,用load設(shè)置它的裝載地址,用設(shè)置它的裝載地址,用run設(shè)置設(shè)置它的運(yùn)行地址。它的運(yùn)行地址。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 調(diào)準(zhǔn)地址:調(diào)準(zhǔn)地址:規(guī)定段應(yīng)在規(guī)定段應(yīng)在地址邊界地址邊界上開(kāi)始。調(diào)準(zhǔn)可以使鏈接器把輸出段放在位上開(kāi)始。調(diào)準(zhǔn)可以

26、使鏈接器把輸出段放在位 于于n字邊界的地址,其中字邊界的地址,其中n是是2的冪。的冪。 語(yǔ)法:語(yǔ)法:align=n 或或align=(n) 如如 .text align=128, 即將即將.text段定位于頁(yè)邊界。段定位于頁(yè)邊界。 塊地址:塊地址:規(guī)定段必須裝在兩個(gè)地址邊界之間規(guī)定段必須裝在兩個(gè)地址邊界之間,它把段定位在大小為它把段定位在大小為n的塊內(nèi)的塊內(nèi) 任何地方,如果段大于塊,那么段將從該邊界開(kāi)任何地方,如果段大于塊,那么段將從該邊界開(kāi) 始。和調(diào)準(zhǔn)一始。和調(diào)準(zhǔn)一 樣,樣,n必須是必須是2的冪。的冪。 語(yǔ)法:語(yǔ)法:block=n 或或 block(n) 如如 .bss load=block

27、(0 x80)。 定位定位.bss段使其包含在單個(gè)段使其包含在單個(gè)128字的頁(yè)內(nèi)或者從新頁(yè)開(kāi)始。用戶可以單獨(dú)使用字的頁(yè)內(nèi)或者從新頁(yè)開(kāi)始。用戶可以單獨(dú)使用調(diào)準(zhǔn)或塊,也可以和裝入地址、運(yùn)行地址結(jié)合在一起使用,但是調(diào)準(zhǔn)或塊,也可以和裝入地址、運(yùn)行地址結(jié)合在一起使用,但是調(diào)準(zhǔn)和塊不能一調(diào)準(zhǔn)和塊不能一起使用。起使用。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 輸入段:輸入段:定義組成輸出段的輸入段。定義組成輸出段的輸入段。 語(yǔ)法:語(yǔ)法: input_sections 輸入文件中的段組合起來(lái)形成輸出段,鏈接器按照所列出的輸入段的次序輸入文件中的段組合起來(lái)形成輸

28、出段,鏈接器按照所列出的輸入段的次序鏈接并組合它們。輸出段的大小是組成它的輸入段的大小之和。鏈接并組合它們。輸出段的大小是組成它的輸入段的大小之和。 通用類型的段的規(guī)格說(shuō)明中沒(méi)有輸入段。通用類型的段的規(guī)格說(shuō)明中沒(méi)有輸入段。 如如 :SECTIONS .text: .data: .bss : 此時(shí)鏈接器從輸入文件取出所有此時(shí)鏈接器從輸入文件取出所有.text段并把它們組合到段并把它們組合到.text輸出段內(nèi)。鏈接器輸出段內(nèi)。鏈接器按照它在輸入文件中遇到的次序鏈接按照它在輸入文件中遇到的次序鏈接.text輸入段,對(duì)輸入段,對(duì).data和和.bss段的操作與段的操作與.text相相同。同。 用戶也可

29、以明確規(guī)定組成輸出段的輸入段用戶也可以明確規(guī)定組成輸出段的輸入段,每個(gè)輸入段用它的文件名和段名來(lái)每個(gè)輸入段用它的文件名和段名來(lái)標(biāo)志。標(biāo)志。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令例例6.25 SECTIONS .text f1.obj(.text) f2.obj(sec1) f3.obj f3.obj(.text,sec2) 輸入段不必相互同名也不必和輸出段同名。如果列舉輸入文件時(shí)不帶段,輸入段不必相互同名也不必和輸出段同名。如果列舉輸入文件時(shí)不帶段,那么它所有的段將被包含在輸出段之內(nèi)。那么它所有的段將被包含在輸出段之內(nèi)。7.4 目標(biāo)文件鏈接目標(biāo)

30、文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 段類型:段類型:定義特殊段類型的標(biāo)志。定義特殊段類型的標(biāo)志。 語(yǔ)法:語(yǔ)法:type=COPY 或或 type=DSECT 或或 type=NOLOAD 用戶可以把這用戶可以把這3種特殊的類型賦予輸出段。用種特殊的類型賦予輸出段。用COPY和和DSECT創(chuàng)建的段是一創(chuàng)建的段是一個(gè)虛段個(gè)虛段,它不包括在輸出段存儲(chǔ)器分配內(nèi),也不占據(jù)存儲(chǔ)器空間,不包括在存儲(chǔ),它不包括在輸出段存儲(chǔ)器分配內(nèi),也不占據(jù)存儲(chǔ)器空間,不包括在存儲(chǔ)器映象列表中。但在虛段中定義的全局符號(hào)可以被其他輸入段引用,器映象列表中。但在虛段中定義的全局符號(hào)可以被其他輸入段引用

31、,COPY段可段可以將段的內(nèi)容、重定位信息及行號(hào)信息放在輸出模塊中,而以將段的內(nèi)容、重定位信息及行號(hào)信息放在輸出模塊中,而DSECT段則不放置。段則不放置。 NOLOAD創(chuàng)建的段不將段的內(nèi)容、重定位信息及行號(hào)信息放在輸出模塊中,創(chuàng)建的段不將段的內(nèi)容、重定位信息及行號(hào)信息放在輸出模塊中,但鏈接器為其分配空間并包括在存儲(chǔ)器映象列表中。但鏈接器為其分配空間并包括在存儲(chǔ)器映象列表中。 7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 填充值:填充值:定義用于填充初始化空位的數(shù)值。定義用于填充初始化空位的數(shù)值。 語(yǔ)法:語(yǔ)法:file=value 或或name: =

32、value 當(dāng)初始化輸出段內(nèi)有空位存在時(shí),鏈接器必須提供原始數(shù)據(jù)以填充它。鏈接當(dāng)初始化輸出段內(nèi)有空位存在時(shí),鏈接器必須提供原始數(shù)據(jù)以填充它。鏈接器用器用16位數(shù)值填充空位,該數(shù)值在存儲(chǔ)器內(nèi)復(fù)制直至它填滿空位為止。位數(shù)值填充空位,該數(shù)值在存儲(chǔ)器內(nèi)復(fù)制直至它填滿空位為止。7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令例例6.26 SETIONS偽指令的使用偽指令的使用file1.obj file2.obj -o prog.out SECTIONS .text: load=ROM run=0800h .const: load=ROM .bss: load=R

33、AM vectors: load=0FF80h t1.obj (.intvec1) t2.obj(.intvec2) endvec= . .data : align=16 7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 鏈接器舉例鏈接器舉例 例例6.27是一個(gè)名為是一個(gè)名為demo.cmd的鏈接器命令文件,它鏈接了的鏈接器命令文件,它鏈接了3個(gè)目標(biāo)文件:個(gè)目標(biāo)文件:demo.obj,fft.obj和和tables.obj,并創(chuàng)建了一個(gè)名為,并創(chuàng)建了一個(gè)名為demo.out的可執(zhí)行程序。假的可執(zhí)行程序。假設(shè)目標(biāo)存儲(chǔ)器具有下列配置。設(shè)目標(biāo)存儲(chǔ)器具有下列配置

34、。程序存儲(chǔ)器:程序存儲(chǔ)器:地址范圍地址范圍 內(nèi)容內(nèi)容 0 x3F0000 0 x3FFFBF 片內(nèi)片內(nèi)ROM 0 x3FFFC0 0 x3FFFFF 中斷向量表中斷向量表數(shù)據(jù)存儲(chǔ)器:數(shù)據(jù)存儲(chǔ)器:地址范圍地址范圍 內(nèi)容內(nèi)容 0 x000040 0 x0001FF 堆棧堆棧 0 x000200 0 x0007FF RAM_1 0 x3ED000 0 x3EFFFF RAM_27.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令例例6.27 命令文件命令文件exmp.cmd /* 定義鏈接器選項(xiàng)定義鏈接器選項(xiàng)*/ -e SETUP /* 定義程序入口定義程序入口

35、*/-o demo.out /* 命名輸出文件命名輸出文件 */-m demo.map /* 創(chuàng)建一個(gè)輸出列表文件創(chuàng)建一個(gè)輸出列表文件*/ /* 定義輸入文件定義輸入文件 */demo.obj /* 鏈接三個(gè)目標(biāo)文件鏈接三個(gè)目標(biāo)文件 */fft.objtables.obj /*定義存儲(chǔ)器配置定義存儲(chǔ)器配置 */MEMORYPAGE 0:ROM (R):ORIGIN = 3F0000h, LENGTH =0FFC0h VECTORS (R): ORIGIN = 3FFFC0h,LENGTH = 0040h PAGE 1:STACK (RW):ORIGIN = 000040h, LENGTH =

36、01C0h RAM_2 (RW) : ORIGIN = 000200h, LENGTH = 0600h RAM_1 (RW) : ORIGIN = 3ED000h, LENGTH = 3000h SECTIONS vectors:VECTORS, PAGE=0 .text: load = ROM, PAGE=0 .data:file=07A1Ch, load=RAM_1,PAGE=1 tables.obj(.data) fft.obj(.data) +=100h ; /*創(chuàng)建一個(gè)長(zhǎng)度為創(chuàng)建一個(gè)長(zhǎng)度為100的空間,用的空間,用07A1Ch填充填充*/ var_defs: RAM_2 page=1

37、 /*包含在包含在dmo.obj文件中文件中var_defs段的變量鏈接到數(shù)段的變量鏈接到數(shù) 據(jù)塊據(jù)塊RAM_2中中* .bss: RAM_1, page=1, fill=0FFFFh /* .bss的填充和鏈接的填充和鏈接*/ 7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令鏈接器命令文件和鏈接器偽指令 TMS320C228x器件的默認(rèn)定位器件的默認(rèn)定位MEMORY PAGE 0:PROG: ORIGIN = 0 x000040H, LENGTH = 0 x3FFFC0H PAGE 1: DATA: ORIGIN = 0 x

38、000000H, LENGTH = 0 x010000H PAGE 1: DATA1:ORIGIN = 0 x010000H, LENGTH = 0 x3F0000H SECTIONS .text: PAGE = 0 .data:PAGE = 0 .cinit: PAGE = 0 /*僅在僅在C程序中使用程序中使用* .bss: PAGE = 1 用戶沒(méi)有使用用戶沒(méi)有使用MEMORY和和SECTIONS的情況下,存儲(chǔ)器使用該默認(rèn)定位的情況下,存儲(chǔ)器使用該默認(rèn)定位7.4 目標(biāo)文件鏈接目標(biāo)文件鏈接7.4 程序舉例程序舉例 公用文件公用文件 程序設(shè)計(jì)時(shí),需在多個(gè)模塊中使用相同設(shè)置和中斷處理程序設(shè)計(jì)時(shí),需在多個(gè)模塊中使用相同設(shè)置和中斷處理: 將芯片中映射至將芯片中映射至I/O空間的寄存器地址及標(biāo)號(hào)、預(yù)置變量空間的寄存器地址及標(biāo)號(hào)、預(yù)置變量和常數(shù)的空間等設(shè)置語(yǔ)句集中在一個(gè)文件中,稱為和常數(shù)的空間等設(shè)置語(yǔ)句集中在一個(gè)文件中,稱為I/O寄存器寄存器頭文件(如頭文件(如init.h);); 將轉(zhuǎn)移中斷矢量地址的指令集中在一個(gè)文件中,稱為將轉(zhuǎn)移中斷矢量地址的指令集中在一個(gè)文件中,稱為中中斷矢量頭文件(如斷矢量頭文件(如vector.h);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論