dsp第六章匯編程序_第1頁
dsp第六章匯編程序_第2頁
dsp第六章匯編程序_第3頁
dsp第六章匯編程序_第4頁
dsp第六章匯編程序_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章匯編語言程序設(shè)計(jì)

匯編語言——DSP的靈魂

有一位長(zhǎng)期從事單片機(jī)開發(fā)的工程師說:“每一條匯編指令都執(zhí)行了一個(gè)硬件操作?!薄皢纹瑱C(jī)本質(zhì)上是一條條匯編語言。把一條條匯編指令搞清楚了,也就把單片機(jī)徹底掌握了?!钡诹聟R編語言程序設(shè)計(jì)

使用匯編語言編寫程序的好處:匯編速度快、效率高、實(shí)時(shí)性好;對(duì)匯編語言的理解和掌握能使程序員寫出更好的C語言代碼;對(duì)匯編語言編程可精確控制DSP的時(shí)間特性;C語言存在無法控制的盲區(qū)(寄存器)第六章匯編語言程序設(shè)計(jì)匯編語言包括匯編指令、偽指令和宏指令。匯編指令即為DSP指令系統(tǒng),該類指令在匯編時(shí)將產(chǎn)生一一對(duì)應(yīng)的目標(biāo)代碼;偽指令僅在匯編和連接時(shí)提供控制信息和數(shù)據(jù),并不產(chǎn)生目標(biāo)代碼;宏指令則是用戶自己創(chuàng)建的“指令”,在匯編時(shí)將其展開并匯編為對(duì)應(yīng)的目標(biāo)代碼匯編語言源程序經(jīng)過匯編器匯編生成機(jī)器語言目標(biāo)程序;再由連接器將多個(gè)目標(biāo)程序連接成一個(gè)單一的可執(zhí)行程序DSP匯編程序設(shè)計(jì)開發(fā)過程匯編語言程序的編輯、匯編、鏈接過程編輯Edit匯編dspa鏈接dsplnk仿真SimulatorEmulator.asm匯編源程序.obj目標(biāo)文件.out輸出文件.cmd連接命令文件.lst列表文件-l.map內(nèi)存映像文件-m§6.1匯編語言格式

一、語言格式TMS320匯編語言源程序由源語句組成。源語句包括匯編指令、偽指令、宏指令。源語句的格式[標(biāo)號(hào)][:]助記符[操作數(shù)1,操作數(shù)2,…][;注釋]︸︸︸︸標(biāo)號(hào)域助記符域操作數(shù)域注釋域例: SYMl .set 2 ;符號(hào)SYM1等于2 BEGIN:LDP #SYMl;將2裝入DP .word016h;初始化一個(gè)字為16h標(biāo)號(hào)域標(biāo)號(hào)域是任選域,若使用必須從源語句的第一列開始書寫。標(biāo)號(hào)包含1-32個(gè)字母、數(shù)字、字符,可識(shí)別符號(hào)的大小寫,且規(guī)定第一個(gè)字符不能是數(shù)字;標(biāo)號(hào)后可加或不加冒號(hào)(:)

;如果不使用標(biāo)號(hào),則第一個(gè)字必須是空格或分號(hào)或星號(hào)。當(dāng)選用標(biāo)號(hào)時(shí),其值為段程序計(jì)數(shù)器(SPC)的當(dāng)前值,標(biāo)號(hào)指向與它們相關(guān)聯(lián)的語句。例:行號(hào) SPC 目標(biāo)代碼 源語句10 0040 000A START:.word 0Ah,3,7 0003 0007

標(biāo)號(hào)START的值為40h,它指向字0Ah。2.助記符域助記符是源語句中的關(guān)鍵部分,不能缺省,它表示本指令的操作類型。助記符不能從源語句的第一列開始,如果從第一列開始,將被解釋為標(biāo)號(hào)。助記符包括下列操作碼之一

匯編指令——一般用大寫(例如ABS,MPYSPH); 偽指令——用“.”開始,且為小寫

(例如.data,.list.set): 宏指令——同偽指令(例如.macro.endm)。3.操作數(shù)域操作數(shù)域是跟在助記符域后面的操作數(shù)列表,可缺省。如果多于兩個(gè)操作數(shù),則用逗號(hào)隔開。操作數(shù)可以是常數(shù)、符號(hào)和表達(dá)式。4.注釋域注釋域可以從源語句行的任一列開始并直至本行的末尾;如果它從第一列開始則可以用分號(hào)(;)或星號(hào)(*)開始,在行的其他地方開始的注釋,必須以分號(hào)(;)開始。二、常數(shù)、字符串和符號(hào)1.常數(shù)匯編器支持6種類型的常數(shù);二進(jìn)制整數(shù)八進(jìn)制整數(shù)十進(jìn)制整數(shù)十六進(jìn)制整數(shù)字符常數(shù)匯編時(shí)間常數(shù)以字母B(或b)結(jié)尾,由二進(jìn)制數(shù)字(0,1)組成的數(shù)字串。長(zhǎng)度最大為16位例:00101000b10001111B二、常數(shù)、字符串和符號(hào)1.常數(shù)匯編器支持6種類型的常數(shù);二進(jìn)制整數(shù)八進(jìn)制整數(shù)十進(jìn)制整數(shù)十六進(jìn)制整數(shù)字符常數(shù)匯編時(shí)間常數(shù)以字母Q(或q)結(jié)尾

;由八進(jìn)制數(shù)寧(0-7)組成的數(shù)字串。長(zhǎng)度最大為6位例:103010q300000Q二、常數(shù)、字符串和符號(hào)1.常數(shù)匯編器支持6種類型的常數(shù);二進(jìn)制整數(shù)八進(jìn)制整數(shù)十進(jìn)制整數(shù)十六進(jìn)制整數(shù)字符常數(shù)匯編時(shí)間常數(shù)以字母H(或h)結(jié)尾;由十六進(jìn)制數(shù)字。0-9和A-F(或a-f)組成的數(shù)字串。長(zhǎng)度最大為4位例:032Fh1A03H二、常數(shù)、字符串和符號(hào)1.常數(shù)匯編器支持6種類型的常數(shù);二進(jìn)制整數(shù)八進(jìn)制整數(shù)十進(jìn)制整數(shù)十六進(jìn)制整數(shù)字符常數(shù)匯編時(shí)間常數(shù)包含在單引號(hào)中的一個(gè)或兩個(gè)字

符的串。每個(gè)字符表示為8位ASCII碼例:‘a(chǎn)’定義字符a其值為61H二、常數(shù)、字符串和符號(hào)1.常數(shù)匯編器支持6種類型的常數(shù);二進(jìn)制整數(shù)八進(jìn)制整數(shù)十進(jìn)制整數(shù)十六進(jìn)制整數(shù)字符常數(shù)匯編時(shí)間常數(shù)用.set偽指令對(duì)符號(hào)進(jìn)行賦值例:SHIFT.set3即SHIFT=32.字符串字符串是包含在雙引號(hào)內(nèi)的一串字符;字符在內(nèi)部被表示為8位ASCII碼字符中用于下列場(chǎng)合:

.copy“filename”中的文件名; .sect“sectionname”中的段名; .byte“charstring”中數(shù)據(jù)初始化偽指令 .string偽指令的操作數(shù)。3.符號(hào)符號(hào)被用做標(biāo)號(hào)、常數(shù)及替代符號(hào);符號(hào)名最多可由32個(gè)字母和數(shù)字混合組成;符號(hào)的第一個(gè)字符不能是數(shù)字,符號(hào)內(nèi)不能有空格;由戶定義的符號(hào)分大小寫例如匯編時(shí)ABc、Abc、abc被識(shí)別為3個(gè)不同的符號(hào)。用匯編器選項(xiàng)(-C)可消除對(duì)大小寫的識(shí)別。§6.2偽指令偽指令僅在匯編和連接時(shí)提供控制信息和數(shù)據(jù),并不產(chǎn)生目標(biāo)代碼;TMS320C2000的匯編偽指令的功能:匯編代碼和數(shù)據(jù)到指定的段;為未定義的變量保存空間;控制列表文件;分配存儲(chǔ)器;匯編條件塊;定義全局變量;指定匯編器能得到的宏;檢查符號(hào)調(diào)試信息。

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

共有五條偽指令

.bss ·data .text .sect ·usect

把匯編語句程序的各部分與適當(dāng)?shù)亩温?lián)系起來

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

這類偽指令為當(dāng)前段匯編數(shù)值。例 .int .word .long .byte .string

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

可使段程序計(jì)數(shù)器SPC指向預(yù)定的位置共有兩條偽指令

.align .even

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

該類偽指令控制列表文件的格式。

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

該類偽指令為文件提供信息或提供這些文件的信息。

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

這類偽指令使匯編器根據(jù)表達(dá)式求值結(jié)果的真或假來匯編代碼的某些段。

偽指令分為8類。 1)段定義偽指令 2)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令 4)輸出列表格式偽指令 5)引用其他文件偽指令 6)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令 8)其他偽指令

該類偽指令使定義的符號(hào)名等同于常數(shù)值或字符串例 .set .equ .struct .endstruct

常用的偽指令

終止源程序匯編偽指令.end

賦值偽指令.set和.equ

句法:符號(hào).set數(shù)值 符號(hào).equ

數(shù)值

例: DAC0.set0001h;DAC0=0001h

存儲(chǔ)16位字偽指令.int

和.word

句法;.int

數(shù)值1[,…,數(shù)值n] .word數(shù)值1[,…,數(shù)值n]

例:.word11h,22h,33h

定義標(biāo)題偽指令.title

句法:.title“字符串”

例: .title“example

定義代碼段偽指令.text

創(chuàng)建一個(gè)可執(zhí)行的代碼段。(即為匯編程序正文,通常稱為.text段)

定義數(shù)據(jù)段偽指令.data

創(chuàng)建一個(gè)已初始化數(shù)據(jù)段。(通常稱為.data段)

在存儲(chǔ)器中為變量保留空間偽指令.bss

創(chuàng)建一個(gè)未初始化數(shù)據(jù)段。(即保留一個(gè)數(shù)據(jù)空間,通常稱.bss段)

定義初始化命名段偽指令.sect

創(chuàng)建一個(gè)可定義段名的已初始化數(shù)據(jù)段。句法:.sect“段名”

為未命名段中的變量保留空間偽指令.usect

創(chuàng)建一個(gè)可定義段名的未初始化數(shù)據(jù)段句法:.usect“段名”,長(zhǎng)度*******************exmple.asm****************** .datacoeff .word 011h,022h,033h

.bss var1,1 ;reservespace .bss buffer,10 ;fortwovariablesptr .word 1234h .textadd: LACC 0Fhaloop: SUB #1 BCND aloop,LEQ SACL var1,0 .dataivals .word 0AAh,0BBhvar2 .usect “newvars”,1inbuf .usect “newvars”,7 .text ADD #0FFh§6.3宏指令為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句,減少匯編語言程序的重復(fù)書寫TMS320系列DSP匯編器支持宏指令 (1)宏定義 (2)宏調(diào)用 舉例(1)宏定義格式:宏名.macro[形式參數(shù)1],[形式參數(shù)2],[形式參數(shù)3]…宏體.endm§6.3宏指令為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句,減少匯編語言程序的重復(fù)書寫TMS320系列DSP匯編器支持宏指令 (1)宏定義 (2)宏調(diào)用 舉例(2)宏調(diào)用格式:宏名 [實(shí)參數(shù)1],實(shí)參數(shù)2],[實(shí)參數(shù)3]…

§6.3宏指令為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句,減少匯編語言程序的重復(fù)書寫TMS320系列DSP匯編器支持宏指令 (1)宏定義 (2)宏調(diào)用 舉例例1宏定義:parms .macro x,y,z LACC x ADDy ADDCz .endm宏調(diào)用: parms 55,66,77例2:宏定義:KICK_DOG .macro ;看門狗復(fù)位宏定義 LDP #00E0h ;DP→7000h~707Fh SPLK #055h,WDKEY ;WDCNTR由下一步復(fù)位被使能 SPLK #0AAh,WDKEY ;WDCNTR被復(fù)位 .endm

宏調(diào)用:

KICK_DOG例3:宏定義:DELAY_S .macro delay_value ;延時(shí)=0.05μs×delay_value RPT#delay_value NOP .endm

宏調(diào)用:

DELAY_S

20 ;延時(shí)=1μs§6.3宏指令宏調(diào)用與子程序的區(qū)別:1)宏調(diào)用與子程序都可以被多次調(diào)用,但在程序匯編時(shí),子程序只在一個(gè)地方形成目標(biāo)代碼,而宏調(diào)用在每個(gè)調(diào)用的地方都形成相應(yīng)的目標(biāo)代碼(即只省匯編指令,不省目標(biāo)代碼)2)宏調(diào)用使用參數(shù),而子程序不使用參數(shù)

§6.4公共目標(biāo)文件格式COFF

TMS320系列DSP的目標(biāo)文件格式為公共目標(biāo)文件格式 (COFF:CommonObjectFileFormat)采用這種目標(biāo)文件格式的優(yōu)點(diǎn):將指令和數(shù)據(jù)按照段的概念進(jìn)行組織和存儲(chǔ);程序可讀性大大增強(qiáng);編寫程序更容易;便于程序的移植;有利于進(jìn)行模塊化的程序設(shè)計(jì);為管理代碼段及系統(tǒng)存儲(chǔ)器提供了靈活的方法和手段。

COFF鼓勵(lì)用戶在編寫匯編語言程序時(shí)使用代碼塊和數(shù)據(jù)塊,這些塊被稱為段一、段段是目標(biāo)文件中的最小單位。在存儲(chǔ)器中占據(jù)連續(xù)空間的一塊代碼和數(shù)據(jù)。每個(gè)段都是相互獨(dú)立分開的。COFF目標(biāo)文件包含三個(gè)默認(rèn)的段:

文本段:用.text偽指令來定義,該段通常包含可執(zhí)行代碼

數(shù)據(jù)段:用.data偽指令來定義,該段通常包含巳初始化數(shù)據(jù)

預(yù)留段:用.bss偽指令來定義,該段是為未初始化的數(shù)據(jù)保留空間 另外還有兩個(gè)自定義段: 用.sect偽指令來定義一個(gè)自定義數(shù)據(jù)段 用..usect偽指令來定義一個(gè)自定義預(yù)留段COFF目標(biāo)文件的段分為兩大類:

已初始化段 未初始化段。

有明確內(nèi)容存儲(chǔ)在目標(biāo)文件中;該段的值是不可修改的是建立在程序存儲(chǔ)器中通常包含程序代碼、常數(shù)表格和數(shù)據(jù)已初始化段包括:

.text段(文本段)

.data段(數(shù)據(jù)段) 用.sect創(chuàng)建的自定義段COFF目標(biāo)文件的段分為兩大類:

已初始化段 未初始化段。

在存儲(chǔ)器中保留空間;在目標(biāo)文件中沒有實(shí)際內(nèi)容;運(yùn)行程序時(shí)用于存儲(chǔ)變量

建立在片內(nèi)或片外RAM中未初始化段包括:

.bss段 用.usect創(chuàng)建的自定義段各段在存儲(chǔ)器中的定位

.text.data.bss.sect自定義段.usect自定義段ROMRAM二、匯編器對(duì)段的處理匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect格式:.bss符號(hào),字?jǐn)?shù)符號(hào)——保留存儲(chǔ)器空間第一個(gè)字的變量名;字?jǐn)?shù)——保留存儲(chǔ)器空間的字長(zhǎng)例:

.bss var1,5在存儲(chǔ)器中保留5個(gè)字的空間,第一個(gè)字的變量名為var1二、匯編器對(duì)段的處理匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect格式:符號(hào).usect“段名”,字?jǐn)?shù)符號(hào)——保留存儲(chǔ)器空間第一個(gè)字的變量名;字?jǐn)?shù)——保留存儲(chǔ)器空間的字長(zhǎng)段名——用戶為自定義段起的名字例:var2.usect“newvars”,7在存儲(chǔ)器中保留7個(gè)字的空間,段名為newvars,第一個(gè)字的變量名為var2二、匯編器對(duì)段的處理匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect

.text

段包含可執(zhí)行代碼

.data

和.sect(自定義段)包含已初始化數(shù)據(jù)已初始化段的內(nèi)容在目標(biāo)程序中,并定位到ROM中每個(gè)初始化段可重新定位(實(shí)際地址不確定)

每個(gè)初始化段的編寫可以是不連續(xù)的,通過匯編器可以把相同的段匯編在一起。二、匯編器對(duì)段的處理匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect段程序計(jì)數(shù)器(SPC):

匯編器為每個(gè)段設(shè)立獨(dú)立的程序計(jì)數(shù)器,即段程序計(jì)數(shù)器

SPC即為文本段或數(shù)據(jù)段的當(dāng)前地址。起始值為0*******************exmple.asm******************

.datacoeff .word 011h,022h,033h ;創(chuàng)建.data段

.bss var1,1 ;在.bss段中為兩個(gè) .bss buffer,10 ;變量保留空間ptr .word 1234h ;繼續(xù)建.data段

.text ;創(chuàng)建.text段add: LACC 0Fhaloop: SUB #1 BCND aloop,LEQ SACL var1,0

.data ;繼續(xù)創(chuàng)建.data段ivals .word 0AAh,0BBhvar2 .usect “newvars”,1;創(chuàng)建自定義段newvarsinbuf .usect “newvars”,7;為兩個(gè)變量保留空間 .text ;繼續(xù)創(chuàng)建.text段 ADD #0FFh*******************exmple.asm******************SPC 代碼 0000 .data0000 0011 coeff .word 011h,022h,033h ;創(chuàng)建.data段00010022 0002 00330000 .bss var1,1 ;在.bss段中為兩個(gè)0001 .bss buffer,10 ;變量保留空間0003 0123 ptr .word 0123h ;繼續(xù)建.data段 0000 .text ;創(chuàng)建.text段0000 100f add: LACC 0Fh0001 bfa0 aloop: SUB #1h0002 00010003 e3cc BCND aloop,LEQ0004 0001 0005 9000 SACL var1,

0004 .data ;繼續(xù)創(chuàng)建.data段0004 00aa ivals .word 0AAh,0BBh0005 00bb 0000 var2 .usect “newvars”,1 ;創(chuàng)建自定義段newvars0001 inbuf .usect “newvars”,7;為兩個(gè)變量保留空間000 6 .text ;繼續(xù)創(chuàng)建.text段0006 b8ff ADD #0FFh例中:創(chuàng)建了四個(gè)段 1).text段——7個(gè)字的目標(biāo)代碼 2).data段——6個(gè)字的數(shù)據(jù) 3).bss段——在存儲(chǔ)器中保留11個(gè)字 4)newvars段——自定義段,在存儲(chǔ)器中保留8個(gè)字100fbfa00001e3cc00019000b8ff.text001100220033123400AA00BB.data保留11個(gè)字.bss保留8個(gè)字newvars三、鏈接器對(duì)段的處理

鏈接器對(duì)段的處理要完成兩個(gè)功能:把一個(gè)或多個(gè)目標(biāo)文件(文件名.obj)的各個(gè)段作為鏈接的輸入段,經(jīng)連接產(chǎn)生可執(zhí)行的COFF輸出文件(文件名.out),在其中建立各個(gè)輸出段。為輸出文件的各個(gè)輸出段確定存儲(chǔ)器地址鏈接器使用兩個(gè)命令來支持上述任務(wù):MEMORY——來定義目標(biāo)系統(tǒng)的存儲(chǔ)器配置SECTIONS——告訴連接器怎樣組合輸入段以及輸出段放在存儲(chǔ)器的位置.text.data.bsstable_1初始化段u_vars未初始化段file1.objtable_1初始化段.text.data.bsstable_1初始化段u_vars未初始化段file2.objtable_1初始化段FFT初始化段file1.textfile2.textfile1.datafile2.datafile1table_1file2table_1file2FFTunusedfile1.bssfile2.bssfile1u_varsfile2u_varsunusedRAMROM

文件的鏈接

重定位連接器在處理每一個(gè)段時(shí),原來的段地址都是從地址0000開始,所有可重定位符號(hào)(標(biāo)號(hào))均相對(duì)于它們的段內(nèi)地址。連接器通過下列措施來重定位段 1)把各段定位到存儲(chǔ)器內(nèi),從適當(dāng)?shù)牡刂烽_始; 2)調(diào)整符號(hào)(標(biāo)號(hào))值對(duì)應(yīng)于新的段地址; 3)調(diào)整對(duì)已重定位符號(hào)的引用,以便反映調(diào)整后的符號(hào)值匯編器在需要引用重新定位的符號(hào)處留了重定位的入口;連接器在符號(hào)重定位時(shí),利用這些入口修正對(duì)符號(hào)的引用;例:重定位前 重定位后SPC 代碼 PC 代碼 .ref X0000 .text0000 7980 B Y 0200 79800001 0004’

0201 02040002 bf80 LACC X 0202 bf8000030000!

0203 00100004 be22 Y: IDLE 0204 be22說明:1)X,Y都是需重定位的,Y在本模塊定義,X在另一個(gè)模塊定義;2)程序進(jìn)行匯編時(shí),X值為0(外部引用),Y值為0004(段內(nèi)地址)3)形成兩個(gè)重定位入口:X,Y .text段對(duì)X的引用是外部引用(列表文件中用“!”表示) 對(duì)Y的引用是內(nèi)部引用(列表文件中用“’”表示) 4)假設(shè):X被重定位到地址10h .text段被重定位后從地址0200h開始四、外部符號(hào)的定義與引用所謂外部符號(hào)是在一個(gè)模塊定義,在另一個(gè)模塊引用的符號(hào)外部符號(hào)定義與引用的偽指令:

.def——在當(dāng)前模塊中定義,并可在別的模塊中使用的符號(hào) .ref——在當(dāng)前模塊中使用,但在別的模塊中定義的符號(hào) .global——全局符號(hào)例: .def X ;定義X .ref Y ;引用YX: ADD 056h MPY Y§6.5程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)文件匯編器的功能:將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)如果需要的話,可生成一個(gè)列表文件(.lst文件)將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行dspa [inputfile[objectfile[listingfile]]][-options]dspa——匯編程序名

§6.5程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)文件匯編器的功能:將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)如果需要的話,可生成一個(gè)列表文件(.lst文件)將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行dspa [inputfile[objectfile[listingfile]]][-options]inputfile——輸入?yún)R編語言源程序文件名(.asm文件)(擴(kuò)展名可省缺)§6.5程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)文件匯編器的功能:將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)如果需要的話,可生成一個(gè)列表文件(.lst文件)將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行dspa [inputfile[objectfile[listingfile]]][-options]objectfile——命名創(chuàng)建的目標(biāo)文件名(.obj文件)(若不提供文件名,則以“輸入文件名.obj”來命名)§6.5程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)文件匯編器的功能:將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)如果需要的話,可生成一個(gè)列表文件(.lst文件)將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行dspa [inputfile[objectfile[listingfile]]][-options]listingfile——命名產(chǎn)生的列表文件名(.lst文件)(若不提供文件名,則以“輸入文件名.lst”來命名)§6.5程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)文件匯編器的功能:將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)如果需要的話,可生成一個(gè)列表文件(.lst文件)將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行dspa [inputfile[objectfile[listingfile]]][-options] -options——選項(xiàng)例: -l 產(chǎn)生列表文件

-x 產(chǎn)生交叉引用表列表文件:1 0000 .data2 0001 0011 coeff .word 011h,022h,033h ;創(chuàng)建.data段 00020022 0003 00333 0000 .bss var1,1 ;在.bss段中為兩個(gè)4 0001 .bss buffer,10 ;變量保留空間5 0003 0123 ptr .word 0123h ;繼續(xù)建.data段

6 0000 .text ;創(chuàng)建.text段7 0000 200f add: LAC 0Fh8 0001 d003 aloop: SBLK #1 0002 00018 0003 f280 BLEZ aloop 0004 0001 9 0005 6000 SACL var1,010 0004 .data ;繼續(xù)創(chuàng)建.data段11 0004 00aa ivals .word 0AAh,0BBh 0005 00bb ︸︸ ︸

︸行號(hào) SPC目標(biāo)代碼 源程序語句§6.6程序的鏈接鏈接器的主要任務(wù): 根據(jù)鏈接命令或鏈接命令文件(.cmd文件)把1個(gè)或多個(gè)目標(biāo)文件(文件名.obj)鏈接起來,生成可執(zhí)行的輸出文件(文件名.out)和存儲(chǔ)器映像文件(.map文件)鏈接器所做工作:把各個(gè)段配置到目標(biāo)系統(tǒng)的存儲(chǔ)器對(duì)段和符號(hào)進(jìn)行重定位,給它們指定一個(gè)最終的地址解決輸入文件之間未定義的外部引用鏈接器的運(yùn)行: dsplnkfile1.objfile2.obj-ofile.out或 dsplnklinker.cmd

鏈接命令文件鏈接命令文件的擴(kuò)展名為.cmd,包含以下內(nèi)容: 1)輸入文件名:要鏈接的目標(biāo)文件、歸檔庫文件或其他命令文件 2)鏈接器選項(xiàng) 3)MEMORY和SECTIONS鏈接器偽指令 4)賦值語句:定義并賦值給全局符號(hào) 5)注釋:用/*和*/定界符加注釋鏈接命令文件(.cmd文件)舉例:a.Objb.objc.obj /*inputfilename*/-oprog.out-mprog.map /*options*/MEMORY{ RAM: origin=0100hlength=0100h ROM: origin=0200hlength=0100h}SECTIONS{ .text >ROM .data >ROM .bss >RAM}

MEMORY偽指令MEMORY偽指令用于規(guī)定目標(biāo)存儲(chǔ)器的模型,定義用戶系統(tǒng)所包含的存儲(chǔ)器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號(hào)不同,其存儲(chǔ)器的配置是不相同的。通過MEMORY偽指令可以進(jìn)行不同型號(hào)芯片存儲(chǔ)器的配置MEMORY偽指令的一般句法:MEMORY(大寫){ PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant;}PAGE:定義一個(gè)存儲(chǔ)器空間,最多可定義255頁通常PAGE0定義為程序存儲(chǔ)器

PAGE1

定義為數(shù)據(jù)存儲(chǔ)器

PAGE2

定義為I/O空間不使用PAGE選項(xiàng),則鏈接器默認(rèn)為PAGE0一個(gè)PAGE代表一個(gè)完全獨(dú)立的地址空間。PAGE0上配置的存儲(chǔ)器可以和PAGE1上已配置的存儲(chǔ)器交疊

MEMORY偽指令MEMORY偽指令用于規(guī)定目標(biāo)存儲(chǔ)器的模型,定義用戶系統(tǒng)所包含的存儲(chǔ)器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號(hào)不同,其存儲(chǔ)器的配置是不相同的。通過MEMORY偽指令可以進(jìn)行不同型號(hào)芯片存儲(chǔ)器的配置MEMORY偽指令的一般句法:

MEMORY(大寫) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }name:對(duì)存儲(chǔ)器區(qū)域取名,有1-8個(gè)字符組成名字對(duì)鏈接器沒有特殊意義,僅標(biāo)識(shí)通常存儲(chǔ)器的區(qū)域范圍不同PAGE上的存儲(chǔ)器范圍可以取相同的名字,但同一PAGE內(nèi)的存儲(chǔ)器范圍不能有相同的名字,且不能重疊

MEMORY偽指令MEMORY偽指令用于規(guī)定目標(biāo)存儲(chǔ)器的模型,定義用戶系統(tǒng)所包含的存儲(chǔ)器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號(hào)不同,其存儲(chǔ)器的配置是不相同的。通過MEMORY偽指令可以進(jìn)行不同型號(hào)芯片存儲(chǔ)器的配置MEMORY偽指令的一般句法:

MEMORY(大寫) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }attr(屬性):(可選項(xiàng))為已命名的存儲(chǔ)器區(qū)間規(guī)定1-4個(gè)屬性

R——規(guī)定對(duì)存儲(chǔ)器可讀;

W——規(guī)定對(duì)存儲(chǔ)器可寫;

X——規(guī)定存儲(chǔ)器可裝入可執(zhí)行代碼;

I——規(guī)定存儲(chǔ)器可進(jìn)行初始化任何沒有規(guī)定屬性的存儲(chǔ)器都具有全部四項(xiàng)屬性

MEMORY偽指令MEMORY偽指令用于規(guī)定目標(biāo)存儲(chǔ)器的模型,定義用戶系統(tǒng)所包含的存儲(chǔ)器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號(hào)不同,其存儲(chǔ)器的配置是不相同的。通過MEMORY偽指令可以進(jìn)行不同型號(hào)芯片存儲(chǔ)器的配置MEMORY偽指令的一般句法:

MEMORY(大寫) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }origin:指定一個(gè)存儲(chǔ)器區(qū)域的起始地址也可寫成org或o

MEMORY偽指令MEMORY偽指令用于規(guī)定目標(biāo)存儲(chǔ)器的模型,定義用戶系統(tǒng)所包含的存儲(chǔ)器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號(hào)不同,其存儲(chǔ)器的配置是不相同的。通過MEMORY偽指令可以進(jìn)行不同型號(hào)芯片存儲(chǔ)器的配置MEMORY偽指令的一般句法:

MEMORY(大寫) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }length:指定一個(gè)存儲(chǔ)器區(qū)域的長(zhǎng)度也可寫成len

或l例:所定義的存儲(chǔ)器映像VECSPROG未定義PAGE00000h003Fh0040hFF3FhFF40hFFFFhMMRS未定義PAGE10000h005Fh0060h03FFhFFFFhB2B0B1未定義007Fh

0200h02FFh0300hMEMORY{ PAGE0:VECS: origin=0h,length=0040h PROG: origin=40h,length=0FF00h PAGE1:MMRS: origin=0h,length=0060h B2: origin=60h,length=20h B0: origin=200h,length=100h B1: origin=300h,length=100h}

SECTIONS偽指令SECTIONS偽指令的功能:描述如何將輸入段組合成輸出段定義在執(zhí)行程序中的輸出段規(guī)定輸出段在存儲(chǔ)器中存放的位置允許重新命名輸出段SECTIONS偽指令的一般句法:

SECTIONS(大寫){段名1:[特性1,特性2,……]段名2:[特性1,特性2,……]……}輸出段段名段名后面是段的特性說明:

段的內(nèi)容段的分配存儲(chǔ)器地址特性可以若干個(gè),用逗號(hào)隔開

SECTIONS偽指令SECTIONS偽指令的功能:描述如何將輸入段組合成輸出段定義在執(zhí)行程序中的輸出段規(guī)定輸出段在存儲(chǔ)器中存放的位置允許重新命名輸出段SECTIONS偽指令的一般句法:

SECTIONS(大寫) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性選項(xiàng):(1)裝載地址:規(guī)定段將被裝載在存儲(chǔ)器中的地址句法:load=allocation或allocation或{}>allocationallocation是MEMORY偽指令定義的地址

SECTIONS偽指令SECTIONS偽指令的功能:描述如何將輸入段組合成輸出段定義在執(zhí)行程序中的輸出段規(guī)定輸出段在存儲(chǔ)器中存放的位置允許重新命名輸出段SECTIONS偽指令的一般句法:

SECTIONS(大寫) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性選項(xiàng):(2)運(yùn)行地址:定義段在存儲(chǔ)器內(nèi)運(yùn)行的地址句法:run=allocation或run>allocation如果在一個(gè)段中l(wèi)oad和run的地址相同,run可省略。通常load和run的地址相同。

SECTIONS偽指令SECTIONS偽指令的功能:描述如何將輸入段組合成輸出段定義在執(zhí)行程序中的輸出段規(guī)定輸出段在存儲(chǔ)器中存放的位置允許重新命名輸出段SECTIONS偽指令的一般句法:

SECTIONS(大寫) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性選項(xiàng):(3)輸入段:定義組成輸出段的輸入段句法:{input_sections}

SECTIONS偽指令SECTIONS偽指令的功能:描述如何將輸入段組合成輸出段定義在執(zhí)行程序中的輸出段規(guī)定輸出段在存儲(chǔ)器中存放的位置允許重新命名輸出段SECTIONS偽指令的一般句法:

SECTIONS(大寫) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性選項(xiàng):(4)段類型:定義特定段類型的標(biāo)志句法:type=COPYtype=DSECTtype=NOLOAD

SECTIONS偽指令SECTIONS偽指令的功能:描述如何將輸入段組合成輸出段定義在執(zhí)行程序中的輸出段規(guī)定輸出段在存儲(chǔ)器中存放的位置允許重新命名輸出段SECTIONS偽指令的一般句法:

SECTIONS(大寫) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性選項(xiàng):(5)填充值:定義用于填充未初始化單元的數(shù)值句法:fill=valuename:…{…}=value例:SECTIONS{ .reset:{}>VECSPAGE0 .vectors: {}>VECSPAGE0 .start: {}>PROGPAGE0 .text:{}>PROGPAGE0 .data:{}>PROGPAGE0 .mmrs:{}>MMRSPAGE1 .bss:{}>B2PAGE1 .blk0:{}>B0PAGE1 .blk1:{}>B1PAGE1 .blk2:{}>B2PAGE1} MEMORY{PAGE0:VECS: origin=0h,length=0040h PROG: origin=40h,length=0FF00hPAGE1:MMRS:origin=0h,length=0060h B2: origin=60h,length=20h B0: origin=200h,length=100h B1: origin=300h,length=100h}

在省缺MEMORY和SECTIONS的情況下,鏈接器的默認(rèn)處理:將所有.text輸入段鏈接成一個(gè).text輸出段;將所有.data輸入段組合成一個(gè).data輸出段,并將.text

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論