




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第4章章 DSP匯編語言程序設計匯編語言程序設計 4.1 TMS320C54x匯編語言的基本概念匯編語言的基本概念 4.2 TMS320C54x匯編語言程序設計的基本方法匯編語言程序設計的基本方法 4.3 TMS320C54x匯編語言程序的編輯、匯編與鏈接過程匯編語言程序的編輯、匯編與鏈接過程 4.4 匯編器匯編器 4.5 鏈接器鏈接器 4.6 匯編程序舉例匯編程序舉例 1 1匯編語言源程序的句法格式匯編語言源程序的句法格式 要點要點 以以.asm.asm為擴展名為擴展名 每一行由每一行由4 4個部分組成個部分組成 格式格式 標號標號: 空格空格 助記符助記符 空格空格 操作數操作數 空格空
2、格 ;注釋;注釋 中的 內容為可 選擇部分 供本程序的其它部分或其它程序調 用。標號是任選項,標號后面可以 加也可以不加冒號“:”。 4.1 TMS320C54x4.1 TMS320C54x匯編語言的基本概念匯編語言的基本概念 要要 點點 1.1.標號必須從第列寫起,標號必須從第列寫起, 2.2.標號最多可達標號最多可達3232個字符,可以是個字符,可以是A AZ Z,a az z,0 0 9 9,_ _,以及,以及$ $,但標號的第,但標號的第1 1個字符不能是數字。個字符不能是數字。 3.3.引用標號時,標號的大小寫必須一致。引用標號時,標號的大小寫必須一致。 4.4.標號的值就是段程序計
3、數器標號的值就是段程序計數器SPCSPC的值。的值。 5.5.如果不用標號,則第一個字母必須為空格、分號如果不用標號,則第一個字母必須為空格、分號 或星號(或星號(* *)。)。 要點要點 建議建議 標號標號: 空格空格 助記符助記符 空格空格 操作數操作數 空格空格 ;注釋;注釋 可以是助記符指令、匯編指令、宏可以是助記符指令、匯編指令、宏 指令和宏調用命令。指令和宏調用命令。 1.1.助記符指令,一般用大寫;助記符指令,一般用大寫; 2.2.匯編命令和宏命令,以句號匯編命令和宏命令,以句號“.”.” 開始,且為通常用小寫。開始,且為通常用小寫。 要點要點 標號標號: 空格空格 助記符助記符
4、 空格空格 操作數操作數 空格空格 ;注釋;注釋 1.1.指令中的操作數或匯指令中的操作數或匯 編命令中定義的內容編命令中定義的內容 2.2.操作數之間必須用逗操作數之間必須用逗 號號“,”分開。分開。 1.1.從分號從分號“;”開始開始 2.2.可以放在指令或匯編命令后面,可以放在指令或匯編命令后面, 也可以放在單獨的一行或數行。也可以放在單獨的一行或數行。 要點要點 2 2匯編語言源程序的數據型式匯編語言源程序的數據型式 二進制:如二進制:如1110001b或或1111001B; 八進制:八進制:226q或或572Q; 十進制:十進制:1234或或+1234或或-1234(缺省型)(缺省型
5、) 十六進制:十六進制:0A40h或或0A40H或或0 xA40 浮點數:浮點數:1.623e-23(僅(僅C語言程序中能用,匯編程序不能用)語言程序中能用,匯編程序不能用) 字符:字符:D,每位字符由每位字符由8位位ASCII碼表示;碼表示; 字符串:字符串:“this is a string” 符號用作標號、常數和替代符號。符號名可以是長達符號用作標號、常數和替代符號。符號名可以是長達 200個字符的字母個字符的字母(AZ,az)、數字、數字(09)加上加上$或下或下 劃線劃線(_)。第一個字符不能是數字,符號中間不能有空格。第一個字符不能是數字,符號中間不能有空格。 符號分大小寫,例如:
6、符號分大小寫,例如:Abc。 3匯編語言源程序的匯編語言源程序的符號符號 4表達式 1) 運算順序 影響表達式運算順序的三個主要因素是:圓括號、 優先級和同級運算順序。 圓括號內的表達式最先運算,不能用 或 來代 替( )。 TMS320C54x匯編器的優先級使用與C語言類似, 優先級高的運算先執行。 表4-1給出了表達式中可用的 運算符及優先級。 表4-1 表達式的運算符及優先級 符 號操 作計算順序 +、取正、取負、按位求補從右到左 *、/、%乘、除、求模從左到右 左移、右移從左到右 +、加、減從左到右 、小于、小于等于、大于、大于等于從左到右 !=、=不等于、等于從左到右 說明宏功能說明
7、宏功能 6 7 add3 .macro p1,p2,p3,ADDRP ;定義宏定義宏 8 9 LD p1,A ;將參數將參數1賦給賦給A 10 ADD p2,A ;將參數將參數2與與A相加相加 11 ADD p3,A ;將參數將參數3與與A相加相加 12 STL A,ADDRP ;將結果將結果A的低字存參數的低字存參數4 13 .endm ;結束宏結束宏 14 15 16 .global abc,def,ghi,adr ;定義全局符號定義全局符號 17 18 000000 add3 abc,def,ghi,adr ;調用宏調用宏 1 1 000000 1000! LD abc,A ;宏展開宏展
8、開 1 000001 0000! ADD def,A 1 000002 0000! ADD ghi,A 1 000003 8000! STL A,adr 例例4-2 宏定義、宏調用和宏展開的一個例子。宏定義、宏調用和宏展開的一個例子。 4.2 TMS320C54x匯編語言程序設計的匯編語言程序設計的 基本方法基本方法 DSP的軟件開發一般有以下幾種方式: (1) 直接編寫匯編語言源程序; (2) 編寫C語言程序; (3) 混合編程(既有C代碼,又含匯編代碼)。 4.2.1 TMS320C54x匯編語言源程序的完整結構 匯編語言源程序中,以 .asm為程序的擴展名,程 序員用“段”偽指令來組織程
9、序的結構。程序一般由 數據段、堆棧段和代碼段組成。 .data用于存放有初值的數據塊;.usect用于為堆棧 保留一塊存儲空間;.text用于設置代碼段。另外,.bss 用于為變量保留一塊存儲空間;.sect常用于定義中斷 向量表。 程序的基本結構有四種:順序結構、分支結構、 循環結構和子程序結構。 4.2.2 順序結構程序 順序結構是最基本、最簡單的程序結構形式,程序 中的語句或結構被連續執行。 【例1】 試編制程序,求出下列公式中z的值。 z=(x+y)8-w 源程序編制如下: * * ex41.asm z=(x+y)*8-w * * .title ex41.asm .mmregs STA
10、CK .usectSTACK,10H ; 開辟堆棧空間 .bss x ,1 ; 為變量分配4個字的空間 .bss y ,1 .bss w ,1 .bss z ,1 .def start .data table: .word 6,7,9 .text start: STM #0 ,SWWSR ; 零等待狀態 STM #STACK+10H,SP ; 設置堆棧指針 STM #x,AR1 ; AR1指向x RPT # 2 ; 從程序存儲器傳送3 個值至數據存儲器 MVPD table,*AR1+ LD x,A ADD y,A ; A=x+y LD A,3 ; A=(x+y)*8 SUB w,A ; A=
11、(x+y)*8-w STL A,z end: B end .end 采用順序結構編程時應注意: 合理選取算法; 采用合適的尋址方式進行指令選取; 存儲數據及結果時注意內存空間的分配 和寄存器的使用。 4.2.3 分支結構程序 程序的分支主要是靠條件轉移指令來實現的。 TMS320C54x具有豐富的程序控制與轉移指令,利用這 些指令可以執行分支轉移、循環控制以及子程序操作。 分支轉移指令(如B、BACC、BC等)通過改寫PC,以改 變程序的流向。分支結構也稱條件結構。 【例2】 試編制程序,求一個數的絕對值,并送回原處。 源程序編制如下: * * ex42.asm ABS of positive
12、 or negative * * .title ex42.asm .mmregs STACK .usect STACK,10H ; 開辟堆棧空間 .bss x,1 ; 為變量分配一個字的空間 .def start .data table: .word -7 .text start: STM #0,SWWSR ; 零等待狀態 STM #STACK+10H,SP ; 設置堆棧指針 STM #x,AR1 MVPD table,*AR1 LD *AR1,A BC end,AGT ; 若A0,則轉至end,否則往下執行 ABS A STL A,x end: B end .end 采用分支結構編程時應注意
13、: 正確選擇條件運算符; 正確選擇相應指令; 每個分支中要有完整的終結點; 對于多分支程序,要檢查每個程序正 確與否。 4.2.4 循環結構程序 循環結構程序設計主要用于某些需 要重復進行的操作,它簡化程序,節約 內存。 循環結構程序的設計可分為設置循 環初始狀態、循環體和循環控制條件三 部分。 循環初始狀態主要是指設置循環次數的計 數初值,以及其他為能使循環體正常工作而設 置的初始狀態等(比如緩沖區首地址)。 循環體是循環操作(重復執行)部分,包括 循環的工作部分及修改部分。循環的工作部分 是實現程序功能的主要程序段;循環的修改部 分是指當程序循環執行時,對一些參數(如地址、 變量)的有規律
14、的修正。 循環控制部分是循環程序設計的關鍵。 每個循環程序必須選擇一個控制循環程序運行 和結束的條件。 【例3】 試編制程序,在4項乘積aixi(i=1,2,3,4) 中找出最大值,并存放在累加器A中。 源程序編制如下: .title ex43.asm .mmregs STACK .usect STACK,10H .bss a,4 .bss x,4 .def start .data table: .word 1,2,3,4 .word 8,6,9,7 .text start: STM #0,SWWSR STM #STACK+10H,SP STM #a,AR1 RPT #7 MVPD table
15、,*AR1+ STM #a,AR1 STM #x,AR2 STM #2,AR3 LD *AR1+,T MPY *AR2+,A;第一個乘積在累加器A中 loop1: LD *AR1+,T MPY *AR2+,B;其他乘積在累加器B中 MAX A ;累加器A和B比較,選大的存在A中 BANZ loop1,*AR3- ;此循環中共進行3次乘法和比較 end: B end .end 4.2.5 子程序結構 子程序是一個獨立的程序段,具有確定的功能, 可被其他程序調用,調用它的程序一般為主程序。子 程序調用指令(如:CALL、CALA、CC等)將一個返回 地址壓入堆棧,執行返回指令(如RET、RC等)時
16、復原。 子程序的定義的格式為 子程序名: RET 子程序名 【例4】 試編制程序,求 。這是一個 典型的乘法累加運算,在數字信號處理中用得很多。 4 1i iix ay 源程序編制如下: * * ex44.asm y= a1*x1+a2*x2+a3*x3+a4*x4 * * .title EX44.asm .mmregs STACK .usect STACK,10H ; 開辟堆棧空間 .bss x,4 ; 為變量分配9個字的空間 .bss a,4 .bss y,1 .def start .data table: .word 1*32768/10 .word 2*32768/10 .word -
17、3*32768/10 .word 4*32768/10 .word 8*32768/10 .word 6*32768/10 .word -4*32768/10 .word -2*32768/10 .text start: STM #0,SWWSR ; 零等待狀態 SSBX FRCT STM #STACK+10H,SP ; 設置堆棧指針 STM #x,AR1 ; AR1指向a RPT #7 ; 從程序存儲器傳送8 個值主數據存儲器 MVPD table,*AR1+ CALL SUM ; 調用SUM子程序 end: B end SUM: STM #x,AR2 ; 子程序實現乘累加 STM #a,A
18、R3 RPTZ A,#3 MAC *AR2+,*AR3+,A STH A,y RET .end 【例5】 編寫浮點乘法程序,完成x1x2=0.3(- 0.8)運算。 雖然TMS320C54x是定點DSP,但它可通過以下3條 指令支持浮點運算: EXPA STT,EXPONENT NORMA 假設定點數放在A中,這樣就可以將定點數轉換為 浮點數了。反之,若將浮點數轉換為定點數,只要將 指數取反即可。 浮點數由尾數與指數兩部分組成,其與定點數的 關系如下: 定點數=尾數2(指數) 指數與尾數均用補碼表示。例如,本例中x1的定 點數0 x3333(0.4)用浮點數表示時,尾數為0 x6666(0.8
19、), 指數為1,即0.82-1=0.4;x2的定點數0 xb334(-0.6)用 浮點數表示為-0.6=-0.62-0。 程序中所用的數據變量如下: x1:定點被乘數;e1:被乘數的指數;m1:被乘數的尾數; x2:定點乘數;e2:乘數的指數;m2:乘數的尾數 ; ep:乘積的指數;mp:乘積的尾數 ; product:定點乘積;temp:暫存單元。 首先將定點數x1、x2轉換為浮點數,浮點數相乘 即指數相加,尾數相乘,最后再將乘積(浮點數)轉換為 定點數。 * * ex45.asm x1*x2=0.4* (-0.6) * * .title EX45.asm .mmregs STACK .us
20、ect STACK,10H .bss x1,1 .bss x2,1 .bss e1,1 .bss m1,1 .bss e2,1 .bss m2,1 .bss ep,1 .bss mp,1 .bss product,1 .bss temp,1 .def start .data table: .word 4*32768/10 .word -6*32768/10 .text start: STM #0,SWWSR STM #STACK+10H,SP ;設置堆棧指針 MVPD table,x1 ;將x1、x2傳送至數據存儲器 MVPD table+1,x2 LD x1,16,A ;先將x1加載至A(3
21、116位),因小數在高位 EXP A;提取指數 ST T,e1;保存x1的指數 NORM A ;將x1規格化為浮點數,求得尾數 STH A,m1;保存x1的尾數 LD x2,16,A EXP A ST T,e2;保存x2的指數 NORM A STH A,m2;保存x2的尾數 CALL MULT;調用浮點乘法子程序 done: B done MULT: SSBX FRCT;小數相乘消去冗余符號位 SSBX SXM ;符號位擴展 LD e1,A:指數相加 ADD e2,A STL A,ep LD m1,T ;尾數相乘(有符號數),乘積左移1位 MPY m2,A EXP A;對尾數乘積規格化 ST
22、T,temp NORM A STH A,mp;保存乘積尾數 LD temp,A;修正乘積指數,ep+temp=ep ADD ep,A STL A,ep;保存乘積指數 NEG A ;乘積指數反號,將浮點乘積轉換為定點數 STL A,temp LD temp,T LD mp,16,A NORM A STH A,product;保存定點乘積 RET .end 程序執行結果如下: x13333H x2B334H e10001H m16666H e20000H m2B334H ep0002H mp8520H productE148H tempFFFEH 4.3 TMS320C54x匯編語言程序的編輯、匯
23、匯編語言程序的編輯、匯 編與鏈接過程編與鏈接過程 軟件開發過軟件開發過 程程 匯編語言源程序的編輯、匯編和鏈接過程 編輯匯編 匯編 鏈接 鏈接 調試 調試 固化程序 .asm.obj .cmd .out m .map l .lst -o 編輯 4.4 匯匯 編編 器器 匯編器 (Assembler) 將匯編語言源文件匯編成機器 語言COFF的目標文件。源文件中包括指令、匯編指令 以及宏指令。匯編器的功能如下: 將匯編語言源程序匯編成一個可重新定位的目 標文件( .obj文件)。 根據需要,可以生成一個列表文件( .lst文件)。 根據需要,可以在列表文件后面附加一張交叉 引用表。 將程序代碼分
24、成若干段,為每個目標代碼段設 置一個SPC(段程序計數器)。 定義和引用全局符號。 匯編條件程序塊。 支持宏功能,允許定義宏命令。 運行匯編程序運行匯編程序 asm500 input file-options 匯編器是名為匯編器是名為asm500.exeasm500.exe的可執行程序的可執行程序 例如例如 asm500 cjy.asm -l -s -x 源程序源程序cjy.asm經匯編后將生成一個經匯編后將生成一個cjy. objobj目標目標 文件文件、列表文件、符號表(在目標文件中)以及交列表文件、符號表(在目標文件中)以及交 叉引用表(在列表文件中)。叉引用表(在列表文件中)。 建立公
25、共目標文件建立公共目標文件 格式格式的的目標文件目標文件 匯編器匯編器 和和 鏈接器鏈接器 功能功能的異同的異同 相同點相同點 不同點不同點 匯編器匯編器建立的建立的 是 相 對 地 址是 相 對 地 址 C O F FC O F F 文 件 ,文 件 , 即即.obj.obj文件文件 鏈接器鏈接器建立的建立的 是 絕 對 地 址是 絕 對 地 址 C O F FC O F F 文 件 ,文 件 , 即即.out.out文件文件 匯編器根據匯編命令用適當的段將各部分匯編器根據匯編命令用適當的段將各部分 程序代碼和數據連在一起,構成目標文件;程序代碼和數據連在一起,構成目標文件; 鏈接器的一個任
26、務就是分配存儲單元,即鏈接器的一個任務就是分配存儲單元,即 把各個段重新定位到目標存儲器中。把各個段重新定位到目標存儲器中。 不同種類的區別不同種類的區別 COFFCOFF文件種文件種類類 C54x匯編器和匯編器和C編譯器建立的是編譯器建立的是COFF2文件。文件。 C54x能夠讀能夠讀/寫所有形式的寫所有形式的COFF文件,缺省值下文件,缺省值下 鏈接器生成的是鏈接器生成的是COFF2文件,用鏈接器文件,用鏈接器vn選項選項 可以選擇不同形式的可以選擇不同形式的COFF文件。文件。 COFF0COFF0 COFF1COFF1 COFF2COFF2 標題格式不相同標題格式不相同 數據部分是相同
27、數據部分是相同 段(段(sectionssections)的概念)的概念 特點特點 定義定義 分段的優點:在目標文件中將放置程分段的優點:在目標文件中將放置程 序、數據、變量的代碼分開,便于在鏈序、數據、變量的代碼分開,便于在鏈 接時作為一個單獨的部分分配存儲器。接時作為一個單獨的部分分配存儲器。 由于大多數系統都有好幾種形式的存儲由于大多數系統都有好幾種形式的存儲 器,通過對各個段重新定位,可以使目器,通過對各個段重新定位,可以使目 標存儲器得到更為有效的利用。標存儲器得到更為有效的利用。 段是在存儲器圖中占據相段是在存儲器圖中占據相 鄰空間的代碼或數據塊。鄰空間的代碼或數據塊。 一個目標文
28、件中的每一個一個目標文件中的每一個 段都是分開的和不相同的。段都是分開的和不相同的。 目標文件中的段與目標存目標文件中的段與目標存 儲器之間的關系儲器之間的關系 COFFCOFF文件中的符號文件中的符號 用于處理符號用于處理符號 的匯編命令的匯編命令 外部符號外部符號 在一個模塊中定義在一個模塊中定義的的 定義定義,可在另一個模可在另一個模 塊中引用的符號。塊中引用的符號。 .def.def:在當前模塊中定義,并在當前模塊中定義,并 可在別的模塊中使用的符號。可在別的模塊中使用的符號。 .ref.ref:在當前模塊中使用,但:在當前模塊中使用,但 在別的模塊中定義的符號。在別的模塊中定義的符號
29、。 .global.global:可以是上面的隨便:可以是上面的隨便 哪一種情況。哪一種情況。 .def x .ref y .global z .global q q: B B3 NOP 4 x: MV A0,A1 MVKL y, B3 B z x在此模塊中定義,可被別的模塊引用在此模塊中定義,可被別的模塊引用;y在這里引用,在這里引用, 它在別的模塊中定義它在別的模塊中定義; q在此模塊中定義,可被別的模在此模塊中定義,可被別的模 塊引用塊引用; z在這里引用,它在別的模塊中定義。在這里引用,它在別的模塊中定義。 注注 意意 4.4.2 匯編器對段的處理匯編器對段的處理 用于定義用于定義段段
30、 的匯編命令的匯編命令 .bss .bss 未初始化段未初始化段 .usect .usect 未初始化自定義段未初始化自定義段 .text .text 已初始化程序正文段已初始化程序正文段 .data .data 已初始化程序數據段已初始化程序數據段 .sect .sect 已初始化自定義段已初始化自定義段 如果匯編語言程序中一個段命令都如果匯編語言程序中一個段命令都 沒有用,那么匯編器把程序中的內沒有用,那么匯編器把程序中的內 容都匯編到容都匯編到.text.text段。段。 注意注意 (1 1)未初始化段)未初始化段 未初始化段由未初始化段由.bss.bss和和.usect.usect命令
31、建立命令建立 位置位置 為變量為變量保留存儲器空間保留存儲器空間 作用作用 通常將它們定位到通常將它們定位到RAMRAM區區 使用方法使用方法.bss 符號符號 , 字數字數 符號符號 .usect “段名段名”,字數,字數 對應于保對應于保 留的存儲留的存儲 空間第一空間第一 個字的變個字的變 量名稱量名稱 程序員為自定義未程序員為自定義未 初始化段起的名字初始化段起的名字 (2 2)已初始化段)已初始化段 已初始化段是由已初始化段是由.text.text、.data.data的的.sect.sect命令建立命令建立 位置位置 包含有可執行代碼或初始化數據包含有可執行代碼或初始化數據 作用作
32、用 通常將它們定位到通常將它們定位到EPROMEPROM區區 使用方法使用方法 .text .text 段起點段起點 .data .data 段起點段起點 .sect “.sect “段名段名” ,段起點,段起點 段程序計數段程序計數 器(器(SPCSPC)定)定 義的一個起義的一個起 始值。始值。 程序員為自定義未程序員為自定義未 初始化段起的名字初始化段起的名字 (3)段程序計數器()段程序計數器(SPC) 編址編址 過程過程 表示一個程序代碼段或數據段內的當前地址表示一個程序代碼段或數據段內的當前地址 作用作用 一開始,匯編器將每個一開始,匯編器將每個SPCSPC置置0 0。當匯編器。當
33、匯編器 將程序代碼或數據加到一個段內時,相應將程序代碼或數據加到一個段內時,相應 的的SPCSPC就增加。如果再繼續對某個段匯編,就增加。如果再繼續對某個段匯編, 則相應的則相應的SPCSPC就在先前的數值上繼續增加。就在先前的數值上繼續增加。 鏈接器在鏈接時要對每個段進行重新定位。鏈接器在鏈接時要對每個段進行重新定位。 當匯編器遇到當匯編器遇到.text,.data,.sect偽指令時,匯編偽指令時,匯編 器停止將隨后的程序代碼或數據編譯進當前段,而是器停止將隨后的程序代碼或數據編譯進當前段,而是 順序編譯進遇到的段中。順序編譯進遇到的段中。 當匯編器遇到當匯編器遇到.bss,.usect偽
34、指令時,匯編器暫時偽指令時,匯編器暫時 脫離當前段,隨后的程序代碼或數據仍將順序編譯進脫離當前段,隨后的程序代碼或數據仍將順序編譯進 當前段。當前段。 匯編程序對源程序匯編時,如果采用匯編程序對源程序匯編時,如果采用-l(小寫的小寫的L) 選項,則匯編后將生成一個列表文件。下面給出了一選項,則匯編后將生成一個列表文件。下面給出了一 個列表文件的例子,用來說明在匯編過程中段偽指令個列表文件的例子,用來說明在匯編過程中段偽指令 在不同的段之間來回交換,逐步建立在不同的段之間來回交換,逐步建立COFF段的過程段的過程 和和SPC的修改過程。的修改過程。 列表文件中每行由四個區域組成,即 Field1
35、:源程序的行號。 Field2:段程序計數器SPC。 Field3:目標代碼。 Field4:源程序。 【例6】 段定義偽指令應用舉例。 2 * 3 * Assemble an initialized table into .data. * 4 * 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 * 12 * Still in .data. * 1
36、3 * 14 0003 0123 ptr .word 0123H 15 * 16 * Assemble code into the .text section. * 17 * 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 * 25 0004 .data 26 0004 00aa ivals .word 0
37、AAH,0BBB,0CCH 0005 00bb 0006 00cc 27 * 28 * Define another section for more variables. * 29 * 30 0000 var2 .usect newvars,1 31 0001 inbuf .usect newvars,7 32 * 33 * Assemble more code into .text. * 34 * 35 0005 .text 36 0005 ll0a mpy: LD 0AH,B 37 0006 f166 mloop: MPY #0AH,B 0007 000a 38 0008 f868 BC
38、 mloop,BNOV 0009 0006 39 * 40 * Define a named section for int. vectors. * 41 * 42 0000 .sect vectors 43 0000 0011 .word 011H,033H 44 0001 0033 此例共生成五個段: .text:包含10個字的目標代碼。 .data:包含7個字的數據。 vectors:由 .sect偽指令產生的自定義段,包含2 個字的初始化數據。 .bss:為變量保留10個字的存儲空間。 newvars:由 .usect偽指令產生的自定義段,為 變量保留8個字的存儲空間。 本例的目標代碼
39、如圖4-3所示。 圖4-3 目標代碼 100F F010 0001 Object Code F842 0001 110A F166 000A F868 0006 19 Line Numbers 20 20 21 36 37 37 38 38 21 Section .text 0011 0022 0033 0123 00AA 00BB 00CC 6 6 6 14 26 26 26 .data 0011 0033 43 44 vectors Nodata- 10words reserved Nodata- 8twords reserved 10 30 31 .bss newvars 4.5 鏈鏈
40、接接 器器 鏈接器的功能如下: 將各個段配置到目標系統的存儲器中。 對各個符號和段進行重新定位,并給它 們指定一個最終的地址。 解決輸入文件之間未定義的外部引用問 題。 根據鏈接命令或鏈接命令文件根據鏈接命令或鏈接命令文件 (.cmd.cmd文件),將一個或多個文件),將一個或多個COFFCOFF 目標文件鏈接起來,生成存儲器映目標文件鏈接起來,生成存儲器映 象文件(象文件(.map.map)和可執行的輸出文)和可執行的輸出文 件(件(.out.out)()(COFFCOFF目標模塊)目標模塊) 鏈接器的主要功能就是對程序定位,它采 用的是一種相對的程序定位方式。 程序的定位方式有三種: 編譯
41、時定位( MCU采用,用ORG語句 確定代碼塊和數據塊的絕對地址); 鏈接時定位( DSP采用,按.cmd文件中 的段命令進行實際的定位); 加載時定位( PC機采用,由操作系統 對程序進行定位) 。 運行鏈接程序運行鏈接程序 (1 1)鍵入命令)鍵入命令 lnk500lnk500 (2 2)鍵入命令)鍵入命令lnk500 olnk500 o (3 3)鍵入命令)鍵入命令 lnk500 linker.cmd lnk500 linker.cmd 鏈接器鏈接器是是名為名為lnk500.exe lnk500.exe 的可執行程序的可執行程序 應包含如下內容:應包含如下內容: -o lind.out-
42、o lind.out 建立一個名為建立一個名為a.outa.out (默認情況)的可重新(默認情況)的可重新 定位的輸出模塊。定位的輸出模塊。 4.5.1 鏈接器對段的處理 鏈接器對段的處理具有兩個功能。其一,將輸入 段組合生成輸出段,即將多個 .obj文件中的同名段合 并成一個輸出段;也可將不同名的段合并產生一個輸 出段。其二,將輸出段定位到實際的存儲空間中。鏈 接器提供MEMORY和SECTIONS兩個命令來完成上述 功能。MEMORY命令用于描述系統實際的硬件資源; SECTIONS命令用于描述段如何定位到恰當的硬件資 源上。鏈接器通過命令文件( .cmd)來獲得上述信息。 鏈接器將輸入
43、段組合成一個可執行的目標模塊鏈接器將輸入段組合成一個可執行的目標模塊 4.5.2 鏈接器命令文件 鏈接命令文件含有鏈接時所需要的信息。命令文 件 .cmd由三部分組成:輸入/輸出定義、MEMORY命 令和SECTIONS命令。輸入/輸出定義這部分包括輸入 文件名(目標文件 .obj、庫文件 .lib和交叉索引文 件 .map)、輸出文件.out和鏈接器選項。 MEMORYMEMORY命令用來定義目標系統命令用來定義目標系統中所包中所包 含的各種形式的存儲器含的各種形式的存儲器的存儲器配置的存儲器配置 圖,包括對存儲器各部分命名,以及圖,包括對存儲器各部分命名,以及 規定它們的起始地址和長度。規
44、定它們的起始地址和長度。 (1 1)MEMORYMEMORY命令命令 功功 能能 MEMORYMEMORY PAGE 0: name 1 PAGE 0: name 1 (attrattr): origin=constant, length=constant: origin=constant, length=constant PAGE n: name n PAGE n: name n (attrattr): origin=constant, length=constant: origin=constant, length=constant MEMORYMEMORY命令的一般句法命令的一般句法 對
45、一個存儲空間加以標記,每一個對一個存儲空間加以標記,每一個PAGEPAGE代表一個代表一個 完全獨立的地址空間。頁號完全獨立的地址空間。頁號n n最多可規定為最多可規定為255255, 取決于目標存儲器的配置。通常取決于目標存儲器的配置。通常PAGE 0PAGE 0定為程序定為程序 存儲器,存儲器,PAGE 1PAGE 1定為數據存儲器。如果沒有規定定為數據存儲器。如果沒有規定 PAGEPAGE,則鏈接器就目標存儲器配置在,則鏈接器就目標存儲器配置在PAGE 0PAGE 0。 MEMORYMEMORY PAGE 0: name 1 PAGE 0: name 1 (attrattr): orig
46、in=constant, length=constant: origin=constant, length=constant PAGE n: name n PAGE n: name n (attrattr): origin=constant, length=constant: origin=constant, length=constant MEMORYMEMORY命令的一般句法命令的一般句法 名字可以包含名字可以包含8 8個字符,個字符,A AZ Z、a az z、$ $、. .、_ _均可。均可。 名字并沒有特殊的含義,用來標記存儲器的區間而名字并沒有特殊的含義,用來標記存儲器的區間而 已
47、;名字都是內部記號,不需要保留在輸出文件或已;名字都是內部記號,不需要保留在輸出文件或 者符號表中。不同者符號表中。不同PAGEPAGE上的存儲器區間可以取相同上的存儲器區間可以取相同 的名字,但在同一的名字,但在同一PAGEPAGE內的名字不能相同,且不許內的名字不能相同,且不許 重疊配置。重疊配置。 MEMORYMEMORY PAGE 0: name 1 PAGE 0: name 1 (attrattr): origin=constant, length=constant: origin=constant, length=constant PAGE n: name n PAGE n: na
48、me n (attrattr): origin=constant, length=constant: origin=constant, length=constant MEMORYMEMORY命令的一般句法命令的一般句法 任選項,為命名區規定任選項,為命名區規定 1 14 4個屬性。如果有選項,個屬性。如果有選項, 應寫在括號內。應寫在括號內。 當輸出段定位到存儲器時,當輸出段定位到存儲器時, 可利用屬性加以限制。可利用屬性加以限制。 規定一個存儲區的起始規定一個存儲區的起始 地址。鍵入地址。鍵入originorigin、orgorg 或或o o都可以。這個值是一都可以。這個值是一 個個161
49、6位二進制常數,可位二進制常數,可 以用十進制數、八進制以用十進制數、八進制 數或十六進制數表示。數或十六進制數表示。 規定一個存儲區的長度,鍵規定一個存儲區的長度,鍵 入入lengthlength、lenlen或或l l都可以。都可以。 R 規定可以對存儲器執行讀操作。 W 規定可以對存儲器執行寫操作。 X 規定存儲器可以裝入可執行的程序代碼。 I 規定可以對存儲器進行初始化。 如果一項屬性都沒有選,就可以將輸出段不受限 制地定位到任何一個存儲器位置。任何一個沒有規定 屬性的存儲器都默認有全部4項屬性。 fill:任選項,不常用,在句法中未列出,為沒有 定位輸出段的存儲器空單元填充一個數,鍵
50、入fill或f 均可。這是2個字節的整型常數,可以是十進制數、 八進制數或十六進制數表示。如fill=0FFFFh。 屬性選項一共有4項 例例4-7 MEMORYMEMORY命令的使用方法。命令的使用方法。 / /* * Example command MEMORY directive Example command MEMORY directive * */ / / /* * Input files Input files * */ / -o prog.out /-o prog.out /* * Options Options * */ / MEMORYMEMORY PAGE0: ROM:
51、origin=cooh, length=1000h PAGE0: ROM: origin=cooh, length=1000h PAGE1: SCRTCH: origin=60h, length=20h PAGE1: SCRTCH: origin=60h, length=20h ONCHIP: origin=80h, length=200h ONCHIP: origin=80h, length=200h 名為名為ROMROM的的程序存儲器:程序存儲器:4K4K字字ROMROM,起始地址,起始地址C00hC00h。 名為名為SCRATCHSCRATCH的數據存儲器:的數據存儲器:3232字字RA
52、MRAM,起始地址,起始地址60h60h。 名為名為ONCHIPONCHIP的數據存儲器:的數據存儲器:512512字字RAMRAM,起始地址為,起始地址為80h80h。 告訴鏈接器如何將輸入段合成輸出段告訴鏈接器如何將輸入段合成輸出段 在可執行程序中定義輸出段在可執行程序中定義輸出段 規定輸出段在存儲器中的存放位置規定輸出段在存儲器中的存放位置 允許重新命名輸出項。允許重新命名輸出項。 (2 2)SECTIONSSECTIONS命令命令 功功 能能 在鏈接器命令文件中,在鏈接器命令文件中,SECTIONSSECTIONS命令用大寫命令用大寫 字母,緊隨其后并用大括號括起來的是關于字母,緊隨其
53、后并用大括號括起來的是關于 輸出段的詳細說明。每一個輸出段的說明都輸出段的詳細說明。每一個輸出段的說明都 從段名開始。段名后面是一行說明段的內容從段名開始。段名后面是一行說明段的內容 和如何給段分配存儲單元的性能參數。和如何給段分配存儲單元的性能參數。 注意注意 SECTIONSSECTIONS namename:property,property,property,property,property,property, namename:property,property,property,property,property,property, namename:property,prope
54、rty,property,property,property,property, SECTIONSSECTIONS命令的一般句法命令的一般句法 性能參數性能參數 1)load allocation 定義將輸出段加載到存儲器中定義將輸出段加載到存儲器中 的什么位置。的什么位置。 句法:句法:load=allocation 或者用大于號代替或者用大于號代替 “load=” allocation 或者省掉或者省掉“load=” allocation 其中其中allocation是關于輸出段地址的說明,即給輸是關于輸出段地址的說明,即給輸 出段分配存儲單元。出段分配存儲單元。 .text:load=0
55、 x1000 將輸出段將輸出段.text定位到一個特定地址。定位到一個特定地址。 .text:ROM 將輸出段將輸出段.text定位到名為定位到名為ROM的存儲區。的存儲區。 .bss:(RW)將)將.bss段定位到屬性為段定位到屬性為R、W的存儲區。的存儲區。 2 2)Run allocation Run allocation 用來定義輸出段在存儲器的用來定義輸出段在存儲器的 什么位置上開始運行。什么位置上開始運行。 句法:句法:run=allocation run=allocation 或者用大于號代替等號或者用大于號代替等號 runallocationrunallocation 鏈接器為
56、每個輸出段在目標存儲器中分配兩個地鏈接器為每個輸出段在目標存儲器中分配兩個地 址:一個是加載的地址,另一個是執行程序的地址。址:一個是加載的地址,另一個是執行程序的地址。 通常,這兩個地址是相同的,可以認為每個輸出段只通常,這兩個地址是相同的,可以認為每個輸出段只 有一個地址。有時要想把程序的加載和運行區分開有一個地址。有時要想把程序的加載和運行區分開 (先將程序加載到(先將程序加載到ROMROM,然后在,然后在RAMRAM中以較快的速度運中以較快的速度運 行),只要用行),只要用 SECTIONSSECTIONS命令讓鏈接器對這個段定位兩命令讓鏈接器對這個段定位兩 次就行了。一次是設置加載地
57、址,另一次是設置運行次就行了。一次是設置加載地址,另一次是設置運行 地址。例如:地址。例如: .fir.fir: load=ROM, run=RAMload=ROM, run=RAM 3 3) Input sections Input sections 用來定義由哪些輸入段組用來定義由哪些輸入段組 成輸出段。成輸出段。 句法:句法:input_sectionsinput_sections 大多數情況下,在大多數情況下,在SECTIONSSECTIONS命令中是不列出每個命令中是不列出每個 輸入文件的輸入段的段名的:輸入文件的輸入段的段名的: SECTIONSSECTIONS .text .te
58、xt: .data.data: .bss.bss 這樣,在鏈接時,鏈接器就將所有輸入文件這樣,在鏈接時,鏈接器就將所有輸入文件 的的.text.text段鏈接成段鏈接成.text.text輸出段,其它段也一樣。輸出段,其它段也一樣。 SECTIONSSECTIONS .text: .text: / /* * 建立建立 .text .text 輸出段輸出段 * */ / f1.obj f1.obj(.text.text)/ /* * 鏈接源于鏈接源于f1.objf1.obj的的.text.text段段* */ / f2.obj f2.obj(sec1sec1) / /* *鏈接源于鏈接源于f2.
59、objf2.obj的的sec1sec1段段* */ / f3.obj f3.obj / /* *鏈接源于鏈接源于f3.objf3.obj的所有段的所有段* */ / f4.obj f4.obj(.text,sec2.text,sec2)/ /* *鏈接源于鏈接源于f4.objf4.obj的的.text.text 段和段和sec2sec2段段 * */ / 用文件名和段名來明確地規定輸入段用文件名和段名來明確地規定輸入段 如果沒有利用如果沒有利用MEMORYMEMORY和和SECTIONSSECTIONS命令,鏈接器就按默命令,鏈接器就按默 認算法來定位輸出段:認算法來定位輸出段: MEMORY
60、MEMORY PAGE 0: PROG: origin=0 x0080, length=0 xFF00PAGE 0: PROG: origin=0 x0080, length=0 xFF00 PAGE 1: DATA: origin=0 x0080, length=0 xFF80PAGE 1: DATA: origin=0 x0080, length=0 xFF80 SECTIONSSECTIONS .text: PAGE=0.text: PAGE=0 .data: PAGE=0.data: PAGE=0 .cinit: PAGE=0.cinit: PAGE=0 .bss: PAGE=1.bs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新鄉職業技術學院《分子細胞生物學專論》2023-2024學年第二學期期末試卷
- 浙江橫店影視職業學院《流體輸配管網課程設計》2023-2024學年第一學期期末試卷
- 浙江省慈溪市六校2024-2025學年高中畢業班聯考生物試題含解析
- 湖南省長沙市天心區長郡中學2024-2025學年高三3月月考生物試題理試卷含解析
- 山西省晉南地區達標名校2025屆初三調研試題(一)生物試題含解析
- 浙江省金華市義烏市2025屆高三下學期第十二次重點考試歷史試題含解析
- 新疆新源縣2025年高中畢業生五月供題訓練(二)化學試題含解析
- 星海音樂學院《合成生物技術》2023-2024學年第二學期期末試卷
- 山東省濟寧地區(SWZ)重點中學2025年初三下學期第八次模擬考試物理試題試卷含解析
- 江蘇省南京玄武區十三中學集團科利華2024-2025學年初三考前全真模擬密卷數學試題試卷(6)含解析
- 2023屆高考作文模擬寫作:“成器”和“不器”導寫及范文
- GB/T 8237-2005纖維增強塑料用液體不飽和聚酯樹脂
- GB/T 14713-2009旋切機通用技術條件
- 低成本自動化的開展與案例課件
- 不予受理反訴民事上訴狀(標準版)
- 高中英語語法之虛擬語氣(課件3份)
- 粵教版2022年小學六年級科學下冊期中測試試卷及答案2022-2023
- 北師大六年級下冊數學第三單元《圖形的運動》教學設計
- 國際石油合作主要合同模式課件
- 橋梁加固改造工程施工質量管理體系與措施
- 第二十六章慢性腎小球腎炎演示文稿
評論
0/150
提交評論