DSP教案4(匯編工具).ppt_第1頁(yè)
DSP教案4(匯編工具).ppt_第2頁(yè)
DSP教案4(匯編工具).ppt_第3頁(yè)
DSP教案4(匯編工具).ppt_第4頁(yè)
DSP教案4(匯編工具).ppt_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余33頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、第四章 編譯連接工具的使用,一. C54X匯編工具的使用,C54X的源程序可以使用匯編或C語(yǔ)言編寫(xiě)。使用匯編語(yǔ)言是可以使用助記符指令集(Mnemonic Instruction Set)或代數(shù)指令集(Algebraic Instruction Set),但兩種不能混用。,兩種指令的匯編語(yǔ)言比較,low_pass_mac: push(st1) ; pshm st1 push(st0) ; pshm st0 push(ar0) ; pshm ar0 push(bk) ; pshm bk ar2 = data(#t_ar2) ; mvdm #t_ar2,ar2 ar3= data(#t_ar3) ;

2、 mvdm #t_ar3,ar3 ar0 = #1 ; stm #1,ar0 bk = #N ; stm #N,bk *ar3+% = a ; stl a,*ar3+% repeat(#(N-1),a=0 ; rptz a,#(N-1) a+= *ar2+0% * *ar3+0% ; mac *ar2+0%,*ar3+0%,a,ASM500命令格式如下: asm500 input file object file listing file -options input file: 匯編源文件名,缺省后綴為.asm object file: 編譯輸出的OBJ文件名,缺省后綴為.obj listi

3、ng file: 產(chǎn)生的列表文件名,缺省后綴為.lst options: 編譯器使用的各種選擇。常用選項(xiàng)有: -c:若使用該選項(xiàng),編譯器忽略字母的大小寫(xiě)。例如abc與ABC是一樣的。系統(tǒng)缺省為區(qū)分大小寫(xiě)。,-i:設(shè)置搜索路徑。通知編譯器在指定的搜索路徑中去查找.copy,.include中的文件。用法舉例:-ic:c54x。 -l: (小寫(xiě)的L)在編譯時(shí)產(chǎn)生列表文件,缺省后綴為.lst -mg: 匯編源程序使用代數(shù)指令集 或在源代碼中使用 . Algebraic -s:將所有的符號(hào)都放入符號(hào)表。若不使用該選項(xiàng),編譯器僅將全局變量放入符號(hào)表。 -v: 指定版本。特別是需要使用BOOTLOADER

4、時(shí),應(yīng)加-v548開(kāi)關(guān)。,先看兩個(gè)匯編源程序:,file1.asm .global test loop: call test bc loop,ageq .end file2.asm file3.asm .global test .global test test : test: mar *ar3+ mar(*ar3+) add #1,a a=a+#1 ret return .end .end,匯編工具ASM500的使用舉例,asm500 file1.asm asm500 file2 -l asm500 file3 -mg -l ,TMS320C54x COFF Assembler Versio

5、n 1.20 Sun Jul 30 12:11:25 2000 Copyright (c) 1997 Texas Instruments Incorporated file2.asm PAGE 1 1 .global test 2 3 000000 test: 4 000000 6D93 mar *ar3+ 5 000001 F000 add #1,a 000002 0001 6 000003 FC00 ret 7 8 .end No Errors, No Warnings,TMS320C54x COFF Assembler Version 1.20 Sun Jul 30 12:21:26 2

6、000 Copyright (c) 1997 Texas Instruments Incorporated file3.asm PAGE 1 1 .global test 2 3 000000 test: 4 000000 6D93 mar(*ar3+) 5 000001 F000 a=a+#1 000002 0001 6 000003 FC00 return 7 8 .end No Errors, No Warnings,C54X匯編語(yǔ)言書(shū)寫(xiě)規(guī)范,語(yǔ)法: label: 指令 操作數(shù) ;注釋 #前綴表示立即數(shù)或直接地址 后綴B或b表示二進(jìn)制常數(shù) 例如: LD #1000B,A 后綴Q或q表示八

7、進(jìn)制常數(shù),或以0開(kāi)始的常數(shù) 例如: LD #10Q,A (010,A) 十二進(jìn)制常數(shù) 例如: LD #1000,A,C54X匯編語(yǔ)言書(shū)寫(xiě)規(guī)范,后綴H或h表示十六進(jìn)制常數(shù) 例如: LD #1000H,A 使用.set定義一個(gè)符號(hào)的值 例如 addr .set 1000h stm #addr, ar0 標(biāo)號(hào)的使用 例如 b loop loop: ssbx intm 使用 .global 定義全局標(biāo)號(hào),C54X匯編語(yǔ)言書(shū)寫(xiě)規(guī)范,使用符號(hào)$表示當(dāng)前PC值 例如 B $ 可以使用結(jié)構(gòu) 例如 item .struct .int value .int deltat _len .endstruct . arr

8、ay .tag item .bss array, i_len,C54X匯編語(yǔ)言書(shū)寫(xiě)規(guī)范,可以定義宏 例如 mypush .macro pshm ah pshm al pshm bh pshm bl endm,二.C54X連接工具的使用,使用LNK500命令可以將一個(gè)或多個(gè)OBJ文件連接為一個(gè).OUT文件。在連接時(shí),可以通過(guò)段定位控制命令將不同的代碼、數(shù)據(jù)寫(xiě)入不同的內(nèi)存單元。 注意:LNK500生成的OUT文件不是純二進(jìn)制代碼文件,而是包含代碼、符號(hào)表、代碼定位信息的復(fù)合文件。,LNK500的使用格式: lnk500 -options filename 1 . . filename n 使用舉例

9、:lnk500 file1.obj file2.obj -o file.out LNK500命令常用的選項(xiàng)有: -e global_symbol: 定義程序的進(jìn)入點(diǎn)。global_symbol必須在源程序中使用.global命令說(shuō)明。 -c:使用C編譯器的ROM初始化模式。,-cr: 使用C編譯器的RAM初始化模式。 -i dir : 指定庫(kù)文件的路徑。 -l filename: 指定連接時(shí)使用的庫(kù)文件名。 -m filename: 生成MAP文件。 -o filename: 指定生成的OUT文件名。系統(tǒng)缺省為a.out。 將文件file1.asm和file2.asm連接成OUT文件: lnk

10、500 file1 file2 -m file.map -o file.out,通過(guò)查看MAP文件可以獲得變量、子程序等符號(hào)的具體地址。注意:MAP文件只列出全局變量的地址。(用.global說(shuō)明的符號(hào)),三.匯編連接工具對(duì)段的處理,為了靈活使用C54X的內(nèi)存,可以將不同的代碼段放入不同的內(nèi)存中。在匯編源程序中可以使用下列指令: .bss 該指令表示在.bss段中保留空間。 用法: .bss symbol,size .usect 該指令表示在指定的段中保留空間。用法: symbol .usect “section name”,size,.text 將代碼或數(shù)據(jù)放入.text段中 .data 將

11、數(shù)據(jù)放入.data段中 .sect 將代碼或數(shù)據(jù)放入指定的段中。 用法: symbol .sect “section name”,size 在連接時(shí)使用相應(yīng)的控制命令以確定具體的內(nèi)存地址。下面給出其中一種方法:其中,.bss, .text, .data 三個(gè)段是標(biāo)準(zhǔn)定義,而.vect, .buffer是自定義的。(t.cmd),MEMORY PAGE 0: PROG: origin = 1800h, length = 800h PAGE 4: PROG: origin = 0200h, length = 100h PAGE 1: DATA: origin = 0c00h, length = 1

12、00h PAGE 2: DATA: origin = 0d00h, length = 200h PAGE 3: DATA: origin = 0f00h, length = 100h SECTIONS .text PROG PAGE 0 .vect PROG PAGE 4 .bss DATA PAGE 1 .data DATA PAGE 2 .buffer DATA PAGE 3 ,下面是例子程序t.asm的一部分,其中紅色部分為段的定義 .bss temp,1 buf .usect .buffer,10 .sect .vect start: b mainstart nop nop b $ .

13、text mainstart: ssbx intm ; disable all interrupt !,編譯連接程序exer.asm,通過(guò)MAP文件檢查各個(gè)段是否裝入指定的內(nèi)存地址。 LNK500的選項(xiàng)可以放入內(nèi)存定位文件中。如user.cmd,這時(shí)使用連接命令可以簡(jiǎn)化為: lnk500 user.cmd,四.C編譯器,C54X的C編譯器有兩個(gè)部分組成:先剖系C源代碼并完成優(yōu)化,然后將其轉(zhuǎn)化為匯編源代碼。另一部分就是前面介紹過(guò)的匯編語(yǔ)言工具。所以當(dāng)使用CL500命令對(duì)C語(yǔ)言進(jìn)行編譯時(shí),它實(shí)際上調(diào)用: ac500 C 剖析器 opt500 優(yōu)化器 cg500 匯編語(yǔ)言生成器 asm500 匯編編

14、譯器,若在CL500命令中使用了-z選項(xiàng),C編譯器還可以自動(dòng)調(diào)用LNK500完成連接操作。 下面是一些常用的選項(xiàng): -g: 允許使用C代碼級(jí)的調(diào)試。 -k: 保留生成的匯編源程序。 -ss: 產(chǎn)生C的注釋匯編源程序。 -z: 允許調(diào)用連接程序。 -o: 完成優(yōu)化 CL500還有許多有關(guān)C剖析,優(yōu)化的選項(xiàng)。請(qǐng)參考TMS320C54x Optimizing C Compiler User Guide ,我們舉一個(gè)例子:,/*/ /* function.c */ /* (Sample file for walkthrough) */ /*/ int main(i) int i; return(i 0

15、 ? -i : i ); ,cl500 -o function ,cl500 -k -o function (保留匯編) cl500 -ss -o funtion lnk500 -c function.obj lnk.cmd -o function.out -l rts.lib 或 cl500 function.c -z lnk.cmd -o function.out -l rts.lib C代碼的程序入口地址符號(hào)為_(kāi)c_int00。 LNK500時(shí)使用的-c和-cr是對(duì)C語(yǔ)言中常量(放在.cinit段中)的處理不同。-c表示在運(yùn)行時(shí)處理,而-cr則在裝入時(shí)處理。,_main: ;* A as

16、signed to _i FRAME #-1 nop STL A,*SP(0) ; |2| ;- ; 3 | return(i0 ? -i:i); ;- SSBX SXM nop LD *SP(0),A ; |3| BC L3,AGEQ ; |3| ; branch occurs ; |3| BD L4 ; |3| LD *SP(0),A ; |3| NEG A,A ; |3| ; branch occurs ; |3| L3: LD *SP(0),A ; |3| L4: FRAME #1 ; |4| RET ; |4| ; return occurs ; |4|,; _main: ;* A

17、assigned to _i ;* A assigned to _i ; 3 | return(i0 ? -i:i); ;- SSBX SXM LD *(AL),A ; |3| ABS A,A ; |3| RET ; |4| ; return occurs ; |4|,優(yōu)化后的結(jié)果,C語(yǔ)言編寫(xiě)說(shuō)明,使用Interrupt關(guān)鍵字說(shuō)明函數(shù)的返回使用RETE,例如 interrupt void int_handle() int j,flag; 匯編完成后,使用開(kāi)中斷RETE返回。,C語(yǔ)言編寫(xiě)說(shuō)明,使用volatile關(guān)鍵字。優(yōu)化器會(huì)盡量減少存儲(chǔ)器的訪問(wèn),所以有時(shí)必須禁止優(yōu)化,特別是循環(huán)控制變量。參見(jiàn)

18、下面的例子 unsigned int *ctrl; while(*ctrl != 0 xff); ,L2: ;- ; 4 | while(*ctrl != 0 xff); ;- MVDK *SP(0),*(AR1) ; |4| CMPM *AR1,#255 ; |4| BC L2,NTC ; |4| ; branch occurs ; |4|,未優(yōu)化的結(jié)果,優(yōu)化后的結(jié)果,. MVDK *AR1,*(AR1) L2: ;*-g2: ;* 4- if ( U$1 != 255 ) goto g2; BANZ L2,*AR1(-255) ; |4| ; branch occurs ; |4| ;* - return; .,增加了volatile關(guān)鍵字后,再優(yōu)化,L2: ;*-g2: ;* 4- if ( *ctrl != 255 ) goto g2; CMPM *AR1,#255 ; |4| BC L2,NTC ; |4| ; branch occurs ; |4| ;* - return;,C語(yǔ)言編寫(xiě)說(shuō)明,使用register關(guān)鍵字說(shuō)明寄存器變量。 在C代碼中插入?yún)R編代碼: i+; asm(“ assembler text”); /* 如 asm(“ nop”); 例子,標(biāo)準(zhǔn)的連接定位文件lnk.cmd,rts.lib -st

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論