第5章TMS320C54x軟件開發(fā)_第1頁
第5章TMS320C54x軟件開發(fā)_第2頁
第5章TMS320C54x軟件開發(fā)_第3頁
第5章TMS320C54x軟件開發(fā)_第4頁
第5章TMS320C54x軟件開發(fā)_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第5章 TMS320C54x軟件開發(fā),5.1 軟件開發(fā)過程及開發(fā)工具 5.2 公共目標文件格式 5.3 常用匯編偽指令 5.4 鏈接器命令文件的編寫與使用 5.5 匯編語言程序編寫方法 5.6 TMS320C54x C語言編程 5.7 用C語言和匯編語言混合編程,5.1 軟件開發(fā)過程及開發(fā)工具,1建立源程序:用C語言或匯編語言寫源程序。 2用C編譯器(Compiler)將C語言程序編譯為匯編語言程序。 3用匯編器(Assembler)將匯編語言程序匯編成機器語言的目標程序。 4用連接器(Linker)將目標文件連接在一起,產(chǎn)生可執(zhí)行模塊。 5用調試工具對程序進行反復運行、測試和修改,以達到要求

2、。 6用十六進制轉換公用程序(Hex Conversion Utility)將可執(zhí)行目標程序轉換成可燒寫到EPROM的文件格式。,返回首頁,圖5-1 TMS320C54x DSP軟件開發(fā)流程,歸檔器將匯編宏文件收入?yún)R編宏庫,歸檔器將目標文件收入目標文件庫,C編譯器將C程序編譯為匯編語言程序,匯編器將匯編語言程序匯編為COFF格式目標程序,建庫程序構建運行時支持庫,匯編語言轉換程序將代數(shù)形式程序轉換成匯編語言程序,連接器將COFF目標文件、目標文件庫、運行時支持庫連接成可執(zhí)行COFF文件,HEX轉換器將可執(zhí)行COFF文件轉換成便于燒寫EPROM的HEX或BIN格式文件,EPROM燒寫器將程序寫入

3、EPROM,上電時自動導入C54X運行,調試工具將C可執(zhí)行COFF文件通過硬件仿真器下載到C54X中運行,或者下載到軟件仿真器中運行。,絕對列表器將可執(zhí)行COFF文件轉換成列表文件,給出機器碼、助記符、絕對地址等信息。,交叉引用列表器列出符號、符號的定義,以及引用情況,供排錯使用。,表5-1 TMS320C54xV3.50版代碼生成工具程序,返回本節(jié),5.2 公共目標文件格式,5.2.1 COFF文件的基本單元段 5.2.2 匯編器對段的處理 5.2.3 鏈接器對段的處理 5.2.4 重新定位 5.2.5 程序裝入 5.2.6 COFF文件中的符號,返回首頁,5.2.1 COFF文件的基本單元

4、段,匯編器和連接器建立的目標文件稱為公共目標格式文件,即COFF(Common Object File Format)。COFF使模塊化編程和管理變得方便和容易,因為用匯編語言編寫程序時,是按段來考慮的,所以不同模塊中的相同的段很容易匯編在一起。 段(sections)是COFF文件中最重要的概念。一個段就是最終在存儲器映象中占據(jù)連續(xù)空間的一個數(shù)據(jù)或代碼塊。目標文件中的每一個段都是相互獨立的。一般地,COFF目標文件包含3個缺省的段:text段、data段、bss段。,圖5-2 目標文件中的段與目標存儲器的關系,返回本節(jié),如圖5-2所示為目標文件中的段與目標系統(tǒng)中存儲器的關系。,5.2.2 匯

5、編器對段的處理,1未初始化段 未初始化段主要用來在存儲器中保留空間,通常將它們定位到RAM中。這些段在目標文件中沒有實際內容,只是保留空間而已。程序可以在運行時利用這些空間建立和存儲變量。,段可以分為兩大類:已初始化段和未初始化段。,未初始化段是通過使用.bss和.usect匯編偽指令建立的,兩條偽指令的句法分別為: .bss 符號,字數(shù) 符號.usect “段名”,字數(shù),.bssx,5,x,y . usect “myvar”,6,y,符號指向保留的存儲單元的第一個字,2已初始化段 已初始化段包含可執(zhí)行代碼或已初始化數(shù)據(jù)。這些段的內容存儲在目標文件中,加載程序時再放到TMS320C54X存儲器

6、中。三個用于建立初始化段的偽指令句法分別為: .text段起點 .data段起點 .sect“段名”,段起點,匯編器在對程序進行匯編時,為程序中的每一個段安排了一個段程序計數(shù)器SPC。如:text段、data段、sect段、bss段、usect段分別有自己的段程序計數(shù)器。,段起點用來為段計數(shù)器定義一個起始值。如: .text 10;SPC=10,3命名段 命名段就是程序員自己定義的段,它與缺省的.text、.data和.bss段一樣使用,但與缺省段分開匯編。 例如:重復使用.text命令在目標文件中只建立一個.text段,鏈接后這個.text段作為一個單位分配到存儲器中。如果想將一部分程序放到

7、與.text段不同的存儲器中,可以使用命名段,將命名段放到與.text段不同的存儲器中。 使用命名段可以將已初始化數(shù)據(jù)放到與.data段不同的存儲器中,將未初始化的變量匯編到與bss段不同的存儲器中。,產(chǎn)生命名段的偽指令為: 符號.usect“段名”,字數(shù) .sect “段名”,段起點,4子段 子段(Subsections)是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存儲器圖更加緊密。子段的命名句法為: 基段名:子段名 例:.sect “.text: _func” ;在text段內建立一個稱之為 ; _func的子段。 子段也有兩種,用.sect命令建立的是已初始化段,用.u

8、sect命令建立的是未初始化段。,5段程序計數(shù)器(SPC) 匯編器為每個段安排一個獨立的程序計數(shù)器,即段程序計數(shù)器(SPC)。SPC表示一個程序代碼段或數(shù)據(jù)段內的當前地址。 開始時,匯編器將每個SPC置0,當匯編器將程序代碼或數(shù)據(jù)加到一個段內時,相應的SPC增加。 如果匯編器再次遇到相同段名的段,繼續(xù)匯編至相應的段,且相應的SPC在先前的基礎上繼續(xù)增加。,例5-1 段命令應用舉例: 2 * * * * * * * * * * * * * * * * * * * * * * * * * * 3 * Assemble an initialized table into .data * 4 * *

9、* * * * * * * * * * * * * * * * * * * * * * * * 5 0000 .data 6 0000 0011 coeff .word 011h,022h,033h 0001 0022 0002 0033 7 * * * * * * * * * * * * * * * * * * * * * * * * * * 8 * * Reserve space in .bss for a variable * * 9 * * * * * * * * * * * * * * * * * * * * * * * * * * 10 0000 .bss buffer,10 11

10、 * * * * * * * * * * * * * * * * * * * * * * * * * * 12 * * still in .data * * 13 * * * * * * * * * * * * * * * * * * * * * * * * * * 14 0003 0123 ptr .word 0123h,行號,段計數(shù)器,機器碼,匯編指令,15 * * * * * * * * * * * * * * * * * * * * * * * * * * 16 * * Assemble code into the .text section * * 17 * * * * * * *

11、* * * * * * * * * * * * * * * * * * * 18 0000 .text 19 0000 100f add: LD 0Fh,A 20 0001 f010 aloop: SUB #1,A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22 * * * * * * * * * * * * * * * * * * * * * * * * * * 23 * * Another initialized table into .data * * 24 * * * * * * * * * * * * * * * * * * * *

12、 * * * * * * 25 0004 .data 26 0004 00aa ivals .word 0Aah,0BBh,0CCh 0005 00bb 0006 00cc,27 * * * * * * * * * * * * * * * * * * * * * * * * * * * * Define another section for more variables * * * * * * * * * * * * * * * * * * * * * * * * * * * * 30 0000 var2 .usect “newvars”,1 31 0001 inbuf .usect “ne

13、wvars”,7 32 * * * * * * * * * * * * * * * * * * * * * * * * * * 33 * * Assemble more code into .text * * 34 * * * * * * * * * * * * * * * * * * * * * * * * * * 35 0005 .text 0005 110a mpy: LD 0Ah,B 0006 f166 mloop: MPY #0Ah,B 0007 000a 0008 f868 BC mloop,BNOV 0009 0006 * * * * * * * * * * * * * * *

14、* * * * * * * * * * * * * Define a named section for int. vectors * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0000 .sect “vectors” 0000 0011 .word 011h,033h 0001 0033,圖5-3 例5-1產(chǎn)生的目標代碼,返回本節(jié),在此例中,一共建立了5個段: .text 段內有10個字的程序 代碼。 .data 段內有7個字的數(shù)據(jù)。 vectors是一個用.sect建立的自定義段,段內有2個字的已初始化數(shù)據(jù)。 .bss 在存

15、儲器中為變量保 留10個存儲單元。 newvars是一個用.usect命令 建立的自定義段,它 在存儲器中為變量保 留8個存儲單元。,5.2.3 鏈接器對段的處理,鏈接器對段的處理有兩個功能。 首先,它將匯編器產(chǎn)生的COFF目標文件(.obj文件)中的各種段作為輸入段,當有多個文件進行鏈接時,它將輸入段組合起來,在可執(zhí)行的COFF輸出模塊中建立各個輸出段。 其次,鏈接器為輸出段選擇存儲器地址。,鏈接器有兩個命令完成上述功能,即: MEMORY 命令定義目標系統(tǒng)的存儲器配置圖,包括對存儲器各部分的命名,以及規(guī)定它們的起始地址和長度。 SECTIONS命令告訴鏈接器如何將輸入段組合成輸出段,以及在

16、存儲器何處存放輸出段。子段可以用來更精確地編排段,可用鏈接器SECTIONS命令指定子段。,圖5-4 鏈接器默認的存儲器分配,返回本節(jié),5.2.4 重新定位,1鏈接時重新定位 匯編器將每個段的起始地址處理為0,而所有需要重新定位的符號(標號)在段內都是相對于0地址的,但在存儲器中不可能所有的段都從0地址開始,所以需要通過以下方法將段重新定位: 將各個段定位到存儲器中,每個段都從合適的地址開始。 將符號值調整到相對于新的段地址的數(shù)值。 調整對重新定位后符號的引用。,例5-2 產(chǎn)生重定位入口的一段程序(列表文件)代碼。 1 .ref X ;在別的文件中定義,在此引用 2 .ref Z ; 在別的文

17、件中定義,在此引用 3 0000 .text 4 0000 F073 B Y ;生成一個重定位入口 0001 0006 5 0002 F073 B Z ; 生成一個重定位入口 0003 0000! 6 0004 F020 LD #X,A ;生成一個重定位入口 0005 0000! 7 0006 F7E0 Y: RESET,! 未定義的外部引用 .text段重定位 ” .data段重定位,+ .sect段重定位 - .bss段和.usect段重定位,假設鏈接時X重新定位在地址7100h,.text段重新定位到從地址7200h開始,那么Y的重定位值為7206h。鏈接器利用兩個重定位入口,對目標文件

18、中的兩次引用進行修正: f073 B Y 變成 f073 0006 7206 f020 LD #X,A 變成 f020 0000! 7100 在COFF目標文件中有一張重定位入口表。鏈接器對符號重定位時,利用這些入口修正對符號的引用。鏈接器在處理完之后就將重定位入口消去,以防止在重新鏈接或加載時再次重新定位。,2運行時重新定位 將代碼裝入存儲器的一個地方,而運行在另一個地方。利用SECTIONS命令選項讓鏈接器定位兩次。一些關鍵的執(zhí)行代碼必須裝入在系統(tǒng)的ROM中,但希望在較快的RAM中運行。 鏈接器提供了一個簡單的處理該問題的方法。利用SECTIONS命令選項讓鏈接器定位兩次。第一次使用裝入關

19、鍵字設置裝入地址,再用運行關鍵字設置運行地址。,返回本節(jié),5.2.5 程序裝入,為了運行程序,要將可執(zhí)行程序裝入目標存儲器。方法: (1)硬件仿真器和CCS集成開發(fā)環(huán)境,具有內部的裝入器,調用裝入器的LOAD命令即可裝入可執(zhí)行程序。 (2)將代碼固化在片外存儲器中,采用Hex轉換工具(Hex conversion utility),例如Hex500將可執(zhí)行的COFF目標模塊(.out文件)轉換成幾種其他目標格式文件,然后將轉換后的文件用編程器將代碼寫入EPROM/Flash。,返回本節(jié),5.2.6 COFF文件中的符號,COFF文件中有一個符號表,用于存儲程序中的符號信息。鏈接器對符號重定位時

20、使用該表,調試工具也使用該表來提供符號調試。 外部符號指在一個模塊中定義,在另一個模塊中使用的符號。可使用.def、.ref或.global匯編偽指令將符號定義為外部符號。.def在當前模塊中定義,可以在別的模塊中使用的符號;.ref在當前模塊中引用,但在別的模塊中定義的符號;.global可用于以上任何一種情況。,x: ADD #56h,A ;定義x B y ;引用y .def x ;x在此模塊中定義, ;可被別的模塊引用 .ref y ;y在這里引用, ;它在別的模塊中定義,返回本節(jié),5.3 常用匯編偽指令,返回首頁,1段定義偽指令 為便于鏈接器將程序、數(shù)據(jù)分段定位于指定的(物理存在的)存

21、儲器空間,并將不同的obj文件鏈接起來,設計中常將程序、數(shù)據(jù)、變量分段定義。段的使用非常靈活,但常用以下約定: .text 此段存放程序代碼。 .data 此段存放初始化了的數(shù)據(jù)。 .bss 此段存入未初始化的變量。 .sect 名稱 定義一個有名稱段,放初始化了的數(shù)據(jù)或程序代碼。 符號 .usect 名稱,字數(shù) 定義一個有名稱段,放未初始化的數(shù)據(jù)。,2條件匯編偽指令 .if、.elseif、.else、.endif偽指令告訴匯編器按照表達式的計算結果對代碼塊進行條件匯編。 .if expression 標志條件塊的開始,僅當條件為真(expression的值非0即為真)時匯編代碼。 .els

22、eif expression 標志若.if條件為假,而.elseif條件為真時要匯編代碼塊。 .else 標志若.if條件為假時要匯編代碼塊。 .endif 標志條件塊的結束,并終止該條件代碼塊。,3引用其他文件和初始化常數(shù)偽指令 .include 文件名 將指定文件復制到當前位置,其內容可以是程序、數(shù)據(jù)、符號定義等。 .copy 文件名 與.include類似。 .def 符號名 在當前文件中定義一個符號,可以被其他文件使用。 .ref 符號名 在其他文件中定義,可以在本文件中使用的符號。 .global 符號名 其作用相當于.def、.ref效果之和。,.mmregs 定義存儲器映射寄存器

23、的符號名,這樣就可以用AR0、PMST等助記符替換實際的存儲器地址。 .float 數(shù)1,數(shù)2 指定的各浮點數(shù)連續(xù)放置到存儲器中(從當前段指針開始)。 .word 數(shù)1,數(shù)2 指定的各數(shù)(十六進制)連續(xù)放置到存儲器中。 .space n 以位為單位,空出n位存儲空間。 .end 程序塊結束。 .set定義符號常量,如:K .set 256,4宏定義和宏調用 TMS320C54x匯編支持宏語言。如果程序中需要多次執(zhí)行某段程序,可以把這段程序定義(宏定義)為一個宏,然后在需要重復執(zhí)行這段程序的地方調用這條宏。 宏定義如下: Macname .macroparameter 1,parameter n

24、 .mexit .endm,例5-4 宏定義、宏調用和宏展開的一個例子。 1 * 2 3 * add3 4 * 5 * ADDRP=P1+P2+P3 ;說明宏功能 6 7 add3 .macro p1,p2,p3,ADDRP ;定義宏 8 9 LD p1,A ;將參數(shù)1賦給A 10 ADD p2,A ;將參數(shù)2與A相加 11 ADD p3,A ;將參數(shù)3與A相加 12 STL A,ADDRP ;將結果A的低字存參數(shù)4 13 .endm ;結束宏 14 15 16 .global abc,def,ghi,adr ;定義全局符號 17 18 000000 add3 abc,def,ghi,adr

25、;調用宏 1 1 000000 1000! LD abc,A ;宏展開 1 000001 0000! ADD def,A 1 000002 0000! ADD ghi,A 1 000003 8000! STL A,adr,返回本節(jié),5.4 鏈接器命令文件的編寫與使用,5.4.1 MEMORY偽指令及其使用 5.4.2 SECTIONS偽指令及其使用,返回首頁,(1)將有多個選項的命令,寫成一個鏈接器命令文件.cmd。 (2)進行存儲器分配 (3)運行鏈接器命令文件.cmd,生成一個映象文件.map和一個可執(zhí)行的輸出文件.out,主 要 功 能,(1)輸入文件名,就是要鏈接的目標文件和文檔庫文件

26、,或者是其它的命令文件。如果要調用另一個命令文件作為輸入文件,此句一定要放在本命令文件的最后,因為鏈接器不能從新調用的命令文件返回。 (2)鏈接器選項。這些選項既可以用在鏈接器命令行,也可以編在命令文件中。 (3)MEMORY和SECTIONS都是鏈接器命令。如果鏈接命令文件中沒有MEMORY和SECTIONS命令(默認情況),則鏈接器就從地址0080h一個段接著一個段進行配置。 (4)注釋的內容應當用/*和*/符號括起來。,例5-5 鏈接器命令文件舉例。 a.obj b.obj /* 輸入文件名 */ -o prog.out /* 選項 */ -m prog.map /* 選項 */ MEM

27、ORY /* MEMORY 命令 */ PAGE0: ROM: origin=1000h, length=0100h PAGE1: RAM: origin=0100h, length=0100h SECTIONS /* SECTIONS 命令 */ .text: ROM .data: ROM .bss: RAM ,返回本節(jié),5.4.1 MEMORY偽指令及其使用,MEMORY命令用來定義目標系統(tǒng)中所包含的各種存儲器的存儲器配置圖,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度。,定義系統(tǒng),MEMEORY PAGE0: name1 (attr): origin=constant, leng

28、th=constant PAGEn: namen (attr): origin=constant, length=constant ,對一個存儲空間加以標記,每一個PAGE代表一個完全獨立的地址空間。頁號n最多可規(guī)定為255,取決于目標存儲器的配置。通常PAGE 0定為程序存儲器,PAGE 1定為數(shù)據(jù)存儲器。如果沒有規(guī)定PAGE,則鏈接器將目標存儲器配置在PAGE 0。,存儲區(qū)間的名字可以包含8個字符,AZ、az、$、.、_均可。名字并沒有特殊的含義,用來標記存儲器的區(qū)間而已;名字都是內部記號,不需要保留在輸出文件或者符號表中。不同PAGE上的存儲器區(qū)間可以取相同的名字,但在同一PAGE內的名

29、字不能相同,且不許重疊配置。,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都可以。,返回本節(jié),fill:任選項,指定存儲區(qū)的填充指,為沒有定位輸

30、出段的存儲器空單元填充一個數(shù),鍵入fill或f均可。這是2個字節(jié)的整型常數(shù),可以是十進制數(shù)、八進制數(shù)或十六進制數(shù)表示。如fill=0FFFFh。,5.4.2 SECTIONS偽指令及其使用,SECTIONS偽指令功能如下: 說明如何將輸入段組合成輸出段。 在可執(zhí)行程序中定義輸出段。 指定輸出段在存儲器中存放的位置。 允許對輸出段重新命名。,SECTIONS偽指令的一般語法為: SECTIONS name:property,property,property . name:property,property,property . name:property,property,property .

31、 ,例5-6 SECTIONS命令的使用方法。 file1.obj file2.obj /* Input files */ -o prog.out /* Options */ SECTIONS .text: load=ROM, run=800h .const: load=ROM .bss: load=RAM .vectors: load=FF80h t1.obj(.intvec1) t2.obj(.intvec2) .data: align=16 ,圖5-5 例5-6中段的定位,返回本節(jié),5.5 匯編語言程序編寫方法,5.5.1 匯編語言源程序格式 5.5.2 匯編語言中的常數(shù)和字符串 5.5

32、.3 匯編源程序中的符號 5.5.4 匯編源程序中的表達式,返回首頁,5.5.1 匯編語言源程序格式,助記符指令一般包含4個部分,其一般組成形式為: 標號: 助記符 操作數(shù) ;注釋 1標號區(qū) 所有匯編指令和大多數(shù)匯編偽指令前面都可以帶有標號,標號可以長達32個字符,由AZ、az、09、_、和$符號組成,且第一個字符不能是數(shù)字,區(qū)分大小寫。,2助記符區(qū) 助記符區(qū)不能從第一列開始,否則被認為是標號。 3操作數(shù)區(qū) 操作數(shù)區(qū)是一個操作數(shù)列表,可以是常數(shù)、符號或常數(shù)與符號構成的表達式。操作數(shù)間需用“,”號隔開。 4注釋區(qū) 注釋區(qū)可以從任何一列開始,可以包含ASCII字符和空格。,返回本節(jié),5.5.2 匯

33、編語言中的常數(shù)和字符串,表5-3 COFF常數(shù)與字符串,返回本節(jié),5.5.3 匯編源程序中的符號,1標號:與程序中的位置有關的符號地址。 2局部標號:特殊的標號,其使用范圍和影響是臨時的。 3符號常數(shù):用一個有意義的符號名代表一個常數(shù)。 4先定義的符號常數(shù):匯編器預先定義的符號。$,AR0-AR7。 5替代符號:用.asg將一個字符串賦給替代符號,當匯編器遇到替代符號時,就用它的字符串值替代它。,Label1:LD ADDRA,A SUB ADDRB,A BC $1,ALT LD ADDRB,A B $2 $1: LD ADDRA,A $2: ADD ADDRC,A .newblock BC

34、$1,ALT STL A,ADDRC $1: NOP,局部標號 $代表段程序計數(shù)器的當前值,K.set1024 maxbuf.set2*K value .set 0 delta .set 1,.asg“*+”,INC .asg“*-”,DEC .asg“10,20,30,40”,coefficients .bytecoefficients,符號常數(shù),替代符號,返回本節(jié),5.5.4 匯編源程序中的表達式,表達式可以是常數(shù)、符號或由算術運算符結合的常數(shù)和符號。表達式值的有效范圍為 -3276832767。 1運算符(表5-4 所示) 2合格的表達式(表5-5所示 ),表5-4 可以用在表達式中的運

35、算符,表5-5 帶有絕對符號、可重定位符號的表達式,.data label1.word0,1,2 label2.word3 X.set50 goodsym1.set100h+X; goodsym2.set$; goodsym3.setlabel1; goodsym4.setlabel2-label1;,因為X的值在引用之前已定義,合格表達式,對前面定義的所有局部標號的所有引用,包括當前的SPC( $ )都是合格的,兩個局部標號不是絕對符號,但相同的段內,它們的差是絕對的,.globalextern_1;在外部模塊定義 intern_1:.word”D;在當前模塊定義,可重定位 LAB1:.se

36、t2;LAB1=2,絕對符號 intern_2:.wordAB;在當前模塊定義,可重定位,LD#LAB1+(4+3)*7),A;2+(4+3)*7)=51-A LD#LAB1+4+(3*7),A;2+4+(3*7)=27-A,LDextern_1-10,B; 合法 LD10-extern_1,B;非法,不能將可重定位符號變負 LD-(intern_1),B ;非法,不能將可重定位符號變負 LDextern_1/10,B ;非法,不能將可重定位符號進行乘除 LDintern_1+extern_1,B;非法,LDintern_1-intern_2+extern_1,B; 合法 LDintern_1

37、+intern_2+extern_1,B;非法,intern_1+intern_2不 是絕對值 LDintern_1+extern_1-intern_2,B ;非法,匯編器先計算 intern_1+extern_1,返回本節(jié),5.6 TMS320C54x C語言編程,5.6.1 存儲器模式 5.6.2 寄存器規(guī)則 5.6.3 函數(shù)調用規(guī)則 5.6.4 中斷處理 5.6.5 表達式分析,返回首頁,5.6.1 存儲器模式,1段 C54x將存儲器處理為程序存儲器和數(shù)據(jù)存儲器兩個線性塊。程序存儲器包含可執(zhí)行代碼;數(shù)據(jù)存儲器主要包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。編譯器的任務是產(chǎn)生可重定位的代碼,允許鏈接

38、器將代碼和數(shù)據(jù)定位進合適的存儲空間。C編譯器對C語言編譯后除了生成3個基本段,即.text、.data、.bss外,還生成.cinit、.const、.stack、.sysmem段。,2C/C+系統(tǒng)堆棧 .stack不同于DSP匯編指令定義的堆棧。DSP匯編程序中要將堆棧指針SP指向一塊RAM,用于保存中斷、調用時的返回地址,存放PUSH指令的壓棧內容。 .stack定義的系統(tǒng)堆棧實現(xiàn)的功能是保護函數(shù)的返回地址,分配局部變量,在調用函數(shù)時用于傳遞參數(shù),保護臨時結果。 .stack定義的段大?。ǘ褩4笮。┛捎面溄悠鬟x項-stack size設定,鏈接器還產(chǎn)生一個全局符號_ _STACK_SIZE

39、,并賦給它等于堆棧長度的值,以字為單位,缺省值為1K。,3存儲器分配 (1)運行時間支持函數(shù)。 rts.lib (2)動態(tài)存儲器分配。 malloc calloc (3)靜態(tài)和全局變量的存儲器分配。 (4)位域/結構的對準。,返回本節(jié),5.6.2 寄存器規(guī)則,寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調用過程中如何保護寄存器。 (1)輔助寄存器 AR1,AR6,AR7;AR0,AR2,AR3,AR4,AR5 (2)堆棧指針SP (3)ARP (4)在默認情況下,編譯器總是假定ST1中的OVM在硬件復位時被清0。若在匯編代碼中對OVM置位為1,返回到C環(huán)境時必須復位。 (5)寄存器變量,返回本節(jié),5.6.3 函數(shù)調用規(guī)則,(1)局部幀的產(chǎn)生 (2)參數(shù)傳遞 (3)函數(shù)的返回,返回本節(jié),5.6.4 中斷處理,(1)中斷的使能和屏蔽必須由程序員自己來設置。 (2)中斷程序沒有參數(shù)傳遞,即使說明,也會被忽略 (3)中斷處理程序不能被正常的C程序調用。 (4)為了使中斷程序與中斷一致,在相應的中斷矢量中必須放置一條轉移指令,可以用.sect匯編偽指令建立一個簡單的跳轉

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論