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)介

1、第六章第六章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 匯編語言匯編語言DSPDSP的靈魂的靈魂 有一位長(zhǎng)期從事單片機(jī)開發(fā)的工程師說:有一位長(zhǎng)期從事單片機(jī)開發(fā)的工程師說: “每一條匯編指令都執(zhí)行了一個(gè)硬件操作。每一條匯編指令都執(zhí)行了一個(gè)硬件操作?!?“單片機(jī)本質(zhì)上是一條條匯編語言。把一條條單片機(jī)本質(zhì)上是一條條匯編語言。把一條條匯編指令搞清楚了,也就把單片機(jī)徹底掌握匯編指令搞清楚了,也就把單片機(jī)徹底掌握了。了?!钡诹碌诹?匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 使用匯編語言編寫程序的好處:使用匯編語言編寫程序的好處: 匯編速度快、效率高、實(shí)時(shí)性好;匯編速度快、效率高、實(shí)時(shí)性好; 對(duì)匯編語言的理解和掌握能使

2、程序員寫出更好對(duì)匯編語言的理解和掌握能使程序員寫出更好的的C C語言代碼;語言代碼; 對(duì)匯編語言編程可精確控制對(duì)匯編語言編程可精確控制DSPDSP的時(shí)間特性;的時(shí)間特性; C C語言存在無法控制的盲區(qū)(寄存器)語言存在無法控制的盲區(qū)(寄存器)第六章第六章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)匯編語言包括匯編指令、偽指令和宏指令。匯編語言包括匯編指令、偽指令和宏指令。 匯編指令匯編指令即為即為DSP指令系統(tǒng),該類指令在匯編時(shí)將產(chǎn)生一一對(duì)應(yīng)的指令系統(tǒng),該類指令在匯編時(shí)將產(chǎn)生一一對(duì)應(yīng)的目標(biāo)代碼目標(biāo)代碼; 偽指令偽指令僅在匯編和連接時(shí)提供控制信息和數(shù)據(jù),并不產(chǎn)生目標(biāo)代碼僅在匯編和連接時(shí)提供控制信息和數(shù)據(jù),

3、并不產(chǎn)生目標(biāo)代碼; 宏指令宏指令則是用戶自己創(chuàng)建的則是用戶自己創(chuàng)建的“指令指令”,在匯編時(shí)將其展開并匯編為,在匯編時(shí)將其展開并匯編為對(duì)應(yīng)的目標(biāo)代碼對(duì)應(yīng)的目標(biāo)代碼 匯編語言源程序經(jīng)過匯編器匯編生成機(jī)器語言目標(biāo)程序匯編語言源程序經(jīng)過匯編器匯編生成機(jī)器語言目標(biāo)程序;再由連接器將多個(gè)目標(biāo)程序連接成一個(gè)單一的可執(zhí)行程序再由連接器將多個(gè)目標(biāo)程序連接成一個(gè)單一的可執(zhí)行程序匯編語言程序的編輯、匯編、鏈接過程匯編語言程序的編輯、匯編、鏈接過程編輯Edit匯編dspa鏈接dsplnk仿真SimulatorEmulator.asm匯編源程序.obj目標(biāo)文件.out輸出文件.cmd連接命令文件.lst列表文件-l.m

4、ap內(nèi)存映像文件-m6.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 .word 016h ;初始化一個(gè)字為16h標(biāo)號(hào)域標(biāo)號(hào)域標(biāo)號(hào)域是任選域,若使用必須從源語句的標(biāo)號(hào)域是任選域,若使用必須從源語句的第一列第一列開始書寫。開始書寫。標(biāo)號(hào)包含標(biāo)號(hào)包含

5、1-32個(gè)字母、數(shù)字、字符,可識(shí)別符號(hào)的大小寫,且規(guī)定個(gè)字母、數(shù)字、字符,可識(shí)別符號(hào)的大小寫,且規(guī)定第一個(gè)字符不能是數(shù)字;第一個(gè)字符不能是數(shù)字;標(biāo)號(hào)后可加或不加冒號(hào)標(biāo)號(hào)后可加或不加冒號(hào)(:) ;如果不使用標(biāo)號(hào),則第一個(gè)字必須是空格或分號(hào)或星號(hào)。如果不使用標(biāo)號(hào),則第一個(gè)字必須是空格或分號(hào)或星號(hào)。當(dāng)選用標(biāo)號(hào)時(shí),其值為段程序計(jì)數(shù)器當(dāng)選用標(biāo)號(hào)時(shí),其值為段程序計(jì)數(shù)器(SPC)的當(dāng)前值,標(biāo)號(hào)指向與的當(dāng)前值,標(biāo)號(hào)指向與它們相關(guān)聯(lián)的語句。它們相關(guān)聯(lián)的語句。 例:行號(hào)SPC 目標(biāo)代碼 源語句100040000A START: .word0Ah, 3, 700030007標(biāo)號(hào)START的值為40h,它指向字0Ah

6、。2. 助記符域助記符域助記符是源語句中的關(guān)鍵部分,不能缺省,它表示本指令的助記符是源語句中的關(guān)鍵部分,不能缺省,它表示本指令的操作類型。操作類型。助記符不能從源語句的第一列開始,如果從第一列開始,將助記符不能從源語句的第一列開始,如果從第一列開始,將被解釋為標(biāo)號(hào)。被解釋為標(biāo)號(hào)。助記符包括下列操作碼之一助記符包括下列操作碼之一 匯編指令匯編指令 一般用大寫一般用大寫 (例如例如ABS,MPY SPH); 偽指令偽指令 用用“ . ”開始,且為小寫開始,且為小寫 (例如例如 .data, .list .set): 宏指令宏指令 同偽指令同偽指令 (例如例如 .macro .endm)。3. 操作

7、數(shù)域操作數(shù)域操作數(shù)域是跟在助記符域后面的操作數(shù)列表,可缺省。操作數(shù)域是跟在助記符域后面的操作數(shù)列表,可缺省。如果多于兩個(gè)操作數(shù),則用逗號(hào)隔開。如果多于兩個(gè)操作數(shù),則用逗號(hào)隔開。操作數(shù)可以是常數(shù)、符號(hào)和表達(dá)式。操作數(shù)可以是常數(shù)、符號(hào)和表達(dá)式。4. 注釋域注釋域注釋域可以從源語句行的任一列開始并直至本行的末尾注釋域可以從源語句行的任一列開始并直至本行的末尾;如果它從第一列開始則可以用分號(hào)如果它從第一列開始則可以用分號(hào)(;)或星號(hào)或星號(hào)(*)開始開始,在在行的其他地方開始的注釋,必須以分號(hào)行的其他地方開始的注釋,必須以分號(hào)(;)開始。開始。二、二、 常數(shù)、字符串和符號(hào)常數(shù)、字符串和符號(hào)1常數(shù)常數(shù)匯編

8、器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進(jìn)制整數(shù)二進(jìn)制整數(shù) 八進(jìn)制整數(shù)八進(jìn)制整數(shù) 十進(jìn)制整數(shù)十進(jìn)制整數(shù) 十六進(jìn)制整數(shù)十六進(jìn)制整數(shù) 字符常數(shù)字符常數(shù) 匯編時(shí)間常數(shù)匯編時(shí)間常數(shù)以字母以字母B(或或b)結(jié)尾,結(jié)尾,由二進(jìn)制數(shù)字由二進(jìn)制數(shù)字(0,1)組成的數(shù)字串。組成的數(shù)字串。長(zhǎng)度最大為長(zhǎng)度最大為16位位例:例:00101000b10001111B二、二、 常數(shù)、字符串和符號(hào)常數(shù)、字符串和符號(hào)1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進(jìn)制整數(shù)二進(jìn)制整數(shù) 八進(jìn)制整數(shù)八進(jìn)制整數(shù) 十進(jìn)制整數(shù)十進(jìn)制整數(shù) 十六進(jìn)制整數(shù)十六進(jìn)制整數(shù) 字符常數(shù)字符常數(shù) 匯編時(shí)間常數(shù)匯編時(shí)間常數(shù)以字母以字

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

10、、字符串和符號(hào)1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進(jìn)制整數(shù)二進(jìn)制整數(shù) 八進(jìn)制整數(shù)八進(jìn)制整數(shù) 十進(jìn)制整數(shù)十進(jìn)制整數(shù) 十六進(jìn)制整數(shù)十六進(jìn)制整數(shù) 字符常數(shù)字符常數(shù) 匯編時(shí)間常數(shù)匯編時(shí)間常數(shù)包含在單引號(hào)中的一個(gè)或兩個(gè)字包含在單引號(hào)中的一個(gè)或兩個(gè)字 符的串。符的串。每個(gè)字符表示為每個(gè)字符表示為8位位ASCII碼碼例:例: a 定義字符定義字符 a其值為其值為61H二、二、 常數(shù)、字符串和符號(hào)常數(shù)、字符串和符號(hào)1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進(jìn)制整數(shù)二進(jìn)制整數(shù) 八進(jìn)制整數(shù)八進(jìn)制整數(shù) 十進(jìn)制整數(shù)十進(jìn)制整數(shù) 十六進(jìn)制整數(shù)十六進(jìn)制整數(shù) 字符常數(shù)字符常數(shù) 匯

11、編時(shí)間常數(shù)匯編時(shí)間常數(shù)用用.set偽指令對(duì)符號(hào)進(jìn)行賦值偽指令對(duì)符號(hào)進(jìn)行賦值例:例:SHIFT .set 3即即 SHIFT = 32字符串字符串字符串是包含在雙引號(hào)內(nèi)的一串字符;字符串是包含在雙引號(hào)內(nèi)的一串字符;字符在內(nèi)部被表示為字符在內(nèi)部被表示為8位位ASCII碼碼字符中用于下列場(chǎng)合:字符中用于下列場(chǎng)合:.copy “filename ”中的文件名;中的文件名;.sect “section name”中的段名;中的段名;.byte “charstring ”中數(shù)據(jù)初始化偽指令中數(shù)據(jù)初始化偽指令.string 偽指令的操作數(shù)。偽指令的操作數(shù)。3符號(hào)符號(hào)符號(hào)被用做標(biāo)號(hào)、常數(shù)及替代符號(hào);符號(hào)被用做

12、標(biāo)號(hào)、常數(shù)及替代符號(hào);符號(hào)名最多可由符號(hào)名最多可由32個(gè)字母和數(shù)字混合組成;個(gè)字母和數(shù)字混合組成;符號(hào)的第一個(gè)字符不能是數(shù)字,符號(hào)內(nèi)不能有空格符號(hào)的第一個(gè)字符不能是數(shù)字,符號(hào)內(nèi)不能有空格;由戶定義的符號(hào)分大小寫由戶定義的符號(hào)分大小寫 例如匯編時(shí)例如匯編時(shí)ABc、Abc、 abc被識(shí)別為被識(shí)別為3個(gè)不同的符號(hào)。個(gè)不同的符號(hào)。 用匯編器選項(xiàng)用匯編器選項(xiàng)(-C)可消除對(duì)大小寫的識(shí)別。可消除對(duì)大小寫的識(shí)別。6.2 偽指令偽指令偽指令僅在匯編和連接時(shí)提供控制信息和數(shù)據(jù),并不產(chǎn)生目標(biāo)代碼偽指令僅在匯編和連接時(shí)提供控制信息和數(shù)據(jù),并不產(chǎn)生目標(biāo)代碼;TMS320C2000的匯編偽指令的功能:的匯編偽指令的功能

13、: 匯編代碼和數(shù)據(jù)到指定的段;匯編代碼和數(shù)據(jù)到指定的段; 為未定義的變量保存空間;為未定義的變量保存空間; 控制列表文件;控制列表文件; 分配存儲(chǔ)器;分配存儲(chǔ)器; 匯編條件塊;匯編條件塊; 定義全局變量;定義全局變量; 指定匯編器能得到的宏;指定匯編器能得到的宏; 檢查符號(hào)調(diào)試信息。檢查符號(hào)調(diào)試信息。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令)段程序計(jì)數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令)匯

14、編時(shí)的符號(hào)偽指令8)其他偽指令)其他偽指令 共有五條偽指令共有五條偽指令 .bss data .text .sect usect 把匯編語句程序的各部分與適把匯編語句程序的各部分與適當(dāng)?shù)亩温?lián)系起來當(dāng)?shù)亩温?lián)系起來 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令)段程序計(jì)數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令)匯編時(shí)的符號(hào)偽指令8)其他偽指令)其他偽指令 這類偽指令為當(dāng)前段匯編數(shù)值。這類偽指令為當(dāng)前段匯

15、編數(shù)值。例例 .int.word.long.byte.string 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令3)段程序計(jì)數(shù)器排列偽指令)段程序計(jì)數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令)匯編時(shí)的符號(hào)偽指令8)其他偽指令)其他偽指令 可使段程序計(jì)數(shù)器可使段程序計(jì)數(shù)器SPC指向預(yù)指向預(yù)定的位置定的位置共有兩條偽指令共有兩條偽指令 .align.even 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)

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

17、)匯編時(shí)的符號(hào)偽指令)匯編時(shí)的符號(hào)偽指令8)其他偽指令)其他偽指令 該類偽指令為文件提供信息或該類偽指令為文件提供信息或提供這些文件的信息。提供這些文件的信息。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令)段程序計(jì)數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令)匯編時(shí)的符號(hào)偽指令8)其他偽指令)其他偽指令 這類偽指令使匯編器根據(jù)表這類偽指令使匯編器根據(jù)表達(dá)式求值結(jié)果的真或假來匯達(dá)式求值結(jié)果的真或假來匯編

18、代碼的某些段。編代碼的某些段。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計(jì)數(shù)器排列偽指令)段程序計(jì)數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時(shí)的符號(hào)偽指令)匯編時(shí)的符號(hào)偽指令8)其他偽指令)其他偽指令 該類偽指令使定義的符號(hào)名該類偽指令使定義的符號(hào)名等同于常數(shù)值或字符串等同于常數(shù)值或字符串 例例 .set.equ.struct.endstruct 常用的偽指令常用的偽指令 終止源程序匯編偽指令終止源程序匯編偽指令 .end 賦

19、值偽指令賦值偽指令 .set 和和 .equ 句法:句法: 符號(hào)符號(hào) .set 數(shù)值數(shù)值 符號(hào)符號(hào) .equ 數(shù)值數(shù)值 例:例: DAC0 .set 0001h ;DAC0 = 0001h 存儲(chǔ)存儲(chǔ)16位字偽指令位字偽指令 .int 和和 .word 句法;句法; .int 數(shù)值數(shù)值1,數(shù)值,數(shù)值n .word 數(shù)值數(shù)值1,數(shù)值,數(shù)值n 例:例: .word 11h,22h,33h 定義標(biāo)題偽指令定義標(biāo)題偽指令 .title 句法:句法: .title “字符串字符串” 例:例:.title “example 定義代碼段偽指令定義代碼段偽指令 .text 創(chuàng)建一個(gè)可執(zhí)行的代碼段。創(chuàng)建一個(gè)可執(zhí)行

20、的代碼段。 (即為匯編程序正文,通常稱為(即為匯編程序正文,通常稱為.text段)段) 定義數(shù)據(jù)段偽指令定義數(shù)據(jù)段偽指令 .data 創(chuàng)建一個(gè)已初始化數(shù)據(jù)段。(通常稱為創(chuàng)建一個(gè)已初始化數(shù)據(jù)段。(通常稱為.data段)段) 在存儲(chǔ)器中為變量保留空間偽指令在存儲(chǔ)器中為變量保留空間偽指令 .bss 創(chuàng)建一個(gè)未初始化數(shù)據(jù)段。創(chuàng)建一個(gè)未初始化數(shù)據(jù)段。(即保留一個(gè)數(shù)據(jù)空間,通常稱(即保留一個(gè)數(shù)據(jù)空間,通常稱.bss段)段) 定義初始化命名段偽指令定義初始化命名段偽指令 .sect 創(chuàng)建一個(gè)可定義段名的已初始化數(shù)據(jù)段。創(chuàng)建一個(gè)可定義段名的已初始化數(shù)據(jù)段。 句法:句法: .sect “段名段名” 為未命名段中

21、的變量保留空間偽指令為未命名段中的變量保留空間偽指令 .usect 創(chuàng)建一個(gè)可定義段名的未初始化數(shù)據(jù)段創(chuàng)建一個(gè)可定義段名的未初始化數(shù)據(jù)段 句法:句法: .usect “段名段名”, 長(zhǎng)度長(zhǎng)度* exmple.asm* .datacoeff.word011h, 022h, 033h.bssvar1, 1 ; reserve space.bssbuffer, 10 ; for two variablesptr.word1234h.textadd:LACC 0Fhaloop:SUB#1BCNDaloop,LEQSACLvar1, 0.dataivals.word0AAh, 0BBhvar2.usec

22、t“newvars”, 1inbuf.usect“newvars”, 7.textADD#0FFh6.3 宏指令宏指令為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令指令當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句 ,減少減少匯編語言匯編語言程序的重復(fù)書寫程序的重復(fù)書寫TMS320系列系列DSP匯編器支持宏指令匯編器支持宏指令(1)宏定義宏定義(2 2)宏調(diào)用)宏調(diào)用舉例舉例(1 1)宏定義)宏定義格式格式: :宏名宏名 .macro .macro 形式參數(shù)形式參數(shù)1,

23、1, 形式參數(shù)形式參數(shù)2, 2, 形式參數(shù)形式參數(shù)33 宏體宏體 .endm .endm 6.3 宏指令宏指令為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令指令當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句 ,減少減少匯編語言匯編語言程序的重復(fù)書寫程序的重復(fù)書寫TMS320系列系列DSP匯編器支持宏指令匯編器支持宏指令(1)宏定義宏定義(2 2)宏調(diào)用)宏調(diào)用舉例舉例(2 2)宏調(diào)用)宏調(diào)用格式格式: :宏名宏名 實(shí)參數(shù)實(shí)參數(shù)1, 1, 實(shí)參數(shù)實(shí)參數(shù)2, 2, 實(shí)參數(shù)實(shí)參

24、數(shù)33 6.3 宏指令宏指令為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏為了簡(jiǎn)化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令指令當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句當(dāng)程序需要執(zhí)行這一段程序段時(shí)只要一條宏調(diào)用語句 ,減少減少匯編語言匯編語言程序的重復(fù)書寫程序的重復(fù)書寫TMS320系列系列DSP匯編器支持宏指令匯編器支持宏指令(1)宏定義宏定義(2 2)宏調(diào)用)宏調(diào)用舉例舉例例例1 1宏定義:宏定義:parmsparms.macro.macrox, y, zx, y, zLACCLACCx xADD yADD yADDC zADDC z.endm.endm宏調(diào)

25、用宏調(diào)用: :parmsparms55,66,7755,66,77例例2: 宏定義:宏定義:KICK_DOG.macro;看門狗復(fù)位宏定義看門狗復(fù)位宏定義LDP#00E0h ;DP7000h707FhSPLK#055h, WDKEY;WDCNTR由下一步復(fù)位被使能由下一步復(fù)位被使能SPLK#0AAh, WDKEY ;WDCNTR 被復(fù)位被復(fù)位.endm宏調(diào)用宏調(diào)用: KICK_DOG例例3: 宏定義宏定義:DELAY_S .macrodelay_value;延時(shí)延時(shí) = 0.05 s delay_valueRPT #delay_valueNOP .endm宏調(diào)用宏調(diào)用: DELAY_S 20

26、;延時(shí)延時(shí) = 1 s6.3 宏指令宏調(diào)用與子程序的區(qū)別宏調(diào)用與子程序的區(qū)別: :1 1)宏調(diào)用與子程序都可以被多次調(diào)用,但在程序匯編)宏調(diào)用與子程序都可以被多次調(diào)用,但在程序匯編時(shí),子程序只在一個(gè)地方形成目標(biāo)代碼,而宏調(diào)用時(shí),子程序只在一個(gè)地方形成目標(biāo)代碼,而宏調(diào)用在每個(gè)調(diào)用的地方都形成相應(yīng)的目標(biāo)代碼(即只省在每個(gè)調(diào)用的地方都形成相應(yīng)的目標(biāo)代碼(即只省匯編指令,不省目標(biāo)代碼)匯編指令,不省目標(biāo)代碼)2 2)宏調(diào)用使用參數(shù),而子程序不使用參數(shù))宏調(diào)用使用參數(shù),而子程序不使用參數(shù) 6.4 公共目標(biāo)文件格式公共目標(biāo)文件格式COFF TMS320系列系列DSP的目標(biāo)文件格式為公共目標(biāo)文件格式的目標(biāo)文

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

28、塊被稱為段段一、段一、段段是目標(biāo)文件中的最小單位。段是目標(biāo)文件中的最小單位。 在存儲(chǔ)器中占據(jù)在存儲(chǔ)器中占據(jù)連續(xù)空間連續(xù)空間的一塊代碼的一塊代碼和數(shù)據(jù)。和數(shù)據(jù)。每個(gè)段都是相互獨(dú)立分開的。每個(gè)段都是相互獨(dú)立分開的。COFF目標(biāo)文件包含三個(gè)默認(rèn)的段:目標(biāo)文件包含三個(gè)默認(rèn)的段: 文本段:文本段:用用.text 偽指令來定義,該段通常包含可執(zhí)行代碼偽指令來定義,該段通常包含可執(zhí)行代碼 數(shù)據(jù)段:數(shù)據(jù)段:用用.data 偽指令來定義,該段通常包含巳初始化數(shù)據(jù)偽指令來定義,該段通常包含巳初始化數(shù)據(jù)預(yù)留段:預(yù)留段:用用.bss偽指令來定義,該段是為未初始化的數(shù)據(jù)保留空間偽指令來定義,該段是為未初始化的數(shù)據(jù)保留空

29、間 另外還有兩個(gè)自定義段:另外還有兩個(gè)自定義段:用用 .sect 偽指令來定義一個(gè)偽指令來定義一個(gè)自定義數(shù)據(jù)段自定義數(shù)據(jù)段 用用 .usect 偽指令來定義一個(gè)偽指令來定義一個(gè)自定義預(yù)留段自定義預(yù)留段 COFF目標(biāo)文件的段分為兩大類:目標(biāo)文件的段分為兩大類:已初始化段已初始化段 未初始化段。未初始化段。 有明確內(nèi)容存儲(chǔ)在目標(biāo)文件中;有明確內(nèi)容存儲(chǔ)在目標(biāo)文件中; 該段的值是不可修改的該段的值是不可修改的 是建立在是建立在程序存儲(chǔ)器程序存儲(chǔ)器中中 通常包含通常包含程序代碼、常數(shù)表格和數(shù)據(jù)程序代碼、常數(shù)表格和數(shù)據(jù)已初始化段包括:已初始化段包括:.text段(文本段)段(文本段).data段(數(shù)據(jù)段)

30、段(數(shù)據(jù)段)用用.sect創(chuàng)建的自定義段創(chuàng)建的自定義段 COFF目標(biāo)文件的段分為兩大類:目標(biāo)文件的段分為兩大類:已初始化段已初始化段 未初始化段。未初始化段。 在在存儲(chǔ)器中保留空間存儲(chǔ)器中保留空間; 在目標(biāo)文件中沒有實(shí)際內(nèi)容;在目標(biāo)文件中沒有實(shí)際內(nèi)容; 運(yùn)行程序時(shí)用于運(yùn)行程序時(shí)用于存儲(chǔ)變量存儲(chǔ)變量 建立在片內(nèi)或片外建立在片內(nèi)或片外RAM中中 未初始化段包括:未初始化段包括:.bss段段用用.usect創(chuàng)建的自定義段創(chuàng)建的自定義段各段在存儲(chǔ)器中的定位各段在存儲(chǔ)器中的定位.text.data.bss.sect自定義段.usect自定義段ROMRAM二、匯編器對(duì)段的處理二、匯編器對(duì)段的處理 匯編器根

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

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

33、根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分:匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect .text 段包含可執(zhí)行代碼段包含可執(zhí)行代碼 .data 和和.sect(自定義段)包含已初(自定義段)包含已初始化數(shù)據(jù)始化數(shù)據(jù) 已初始化段的內(nèi)容在目標(biāo)程序中,并定已初始化段的內(nèi)容在目標(biāo)程序中,并定位到位到ROM中中 每個(gè)初始化段可重新定位每個(gè)初始化段可重新定位(實(shí)際地址不實(shí)際地址不確定)確定) 每個(gè)初始化段的編寫可以是不連續(xù)的,每個(gè)初始化段的編寫可以是不連續(xù)的,通過匯編器可以把相同的段匯編在一起。

34、通過匯編器可以把相同的段匯編在一起。二、匯編器對(duì)段的處理二、匯編器對(duì)段的處理 匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分:匯編器根據(jù)定義段的偽指令來識(shí)別匯編程序中的各個(gè)部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect段程序計(jì)數(shù)器(段程序計(jì)數(shù)器(SPC):): 匯編器為每個(gè)段設(shè)立獨(dú)立的程序計(jì)數(shù)器,即段程序計(jì)數(shù)器匯編器為每個(gè)段設(shè)立獨(dú)立的程序計(jì)數(shù)器,即段程序計(jì)數(shù)器 SPC即為文本段或數(shù)據(jù)段的當(dāng)前地址。起始值為即為文本段或數(shù)據(jù)段的當(dāng)前地址。起始值為0* exmple.asm* .datacoeff.word011h, 022h, 033h

35、;創(chuàng)建;創(chuàng)建.data 段段.bssvar1, 1 ;在;在.bss段中為兩個(gè)段中為兩個(gè).bssbuffer, 10;變量保留空間;變量保留空間ptr.word1234h;繼續(xù)建;繼續(xù)建.data 段段.text;創(chuàng)建;創(chuàng)建.text 段段add:LACC 0Fhaloop:SUB#1BCNDaloop,LEQSACLvar1, 0.data;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.data 段段ivals.word0AAh, 0BBhvar2.usect“newvars”, 1 ;創(chuàng)建自定義段;創(chuàng)建自定義段newvarsinbuf.usect“newvars”, 7 ;為兩個(gè)變量保留空間;為兩個(gè)變量保留空間.t

36、ext;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.text 段段ADD#0FFh* exmple.asm* SPC代碼代碼0000.data00000011coeff.word011h, 022h, 033h;創(chuàng)建;創(chuàng)建.data 段段0001 0022000200330000.bssvar1, 1 ;在;在.bss段中為兩個(gè)段中為兩個(gè)0001.bssbuffer, 10 ;變量保留空間;變量保留空間00030123ptr.word0123h ;繼續(xù)建;繼續(xù)建.data 段段0000.text ;創(chuàng)建;創(chuàng)建.text 段段0000100fadd:LACC 0Fh0001bfa0aloop:SUB#1h0002000

37、10003e3ccBCNDaloop,LEQ0004000100059000SACLvar1, 0004.data;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.data 段段000400aaivals.word0AAh, 0BBh000500bb0000var2.usect“newvars”, 1 ;創(chuàng)建自定義段;創(chuàng)建自定義段newvars0001inbuf.usect“newvars”, 7 ;為兩個(gè)變量保留空間;為兩個(gè)變量保留空間0006.text ;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.text 段段0006b8ffADD#0FFh例中:創(chuàng)建了四個(gè)段例中:創(chuàng)建了四個(gè)段1) .text段段7個(gè)字的目標(biāo)代碼個(gè)字的目標(biāo)代碼2) .da

38、ta段段 6個(gè)字的數(shù)據(jù)個(gè)字的數(shù)據(jù)3) .bss 段段 在存儲(chǔ)器中保留在存儲(chǔ)器中保留11個(gè)字個(gè)字4) newvars段段自定義段,在存儲(chǔ)器中保留自定義段,在存儲(chǔ)器中保留8個(gè)字個(gè)字100fbfa00001e3cc00019000b8ff.text001100220033123400AA00BB.data保留11個(gè)字.bss保留8個(gè)字newvars三、鏈接器對(duì)段的處理三、鏈接器對(duì)段的處理 鏈接器對(duì)段的處理要完成兩個(gè)功能:鏈接器對(duì)段的處理要完成兩個(gè)功能:把一個(gè)或多個(gè)目標(biāo)文件把一個(gè)或多個(gè)目標(biāo)文件(文件名文件名.obj)的各個(gè)段作為鏈接的輸入段,的各個(gè)段作為鏈接的輸入段,經(jīng)連接產(chǎn)生可執(zhí)行的經(jīng)連接產(chǎn)生可執(zhí)行

39、的COFF輸出文件輸出文件(文件名文件名.out),在其中建立各,在其中建立各個(gè)輸出段。個(gè)輸出段。為輸出文件的各個(gè)輸出段確定存儲(chǔ)器地址為輸出文件的各個(gè)輸出段確定存儲(chǔ)器地址鏈接器使用兩個(gè)命令來支持上述任務(wù):鏈接器使用兩個(gè)命令來支持上述任務(wù):MEMORY 來定義目標(biāo)系統(tǒng)的存儲(chǔ)器配置來定義目標(biāo)系統(tǒng)的存儲(chǔ)器配置 SECTIONS 告訴連接器怎樣組合輸入段以及輸出段放在存儲(chǔ)器告訴連接器怎樣組合輸入段以及輸出段放在存儲(chǔ)器的位置的位置.text.data.bsstable_1初始化段u_vars未初始化段file1.objtable_1初始化段.text.data.bsstable_1初始化段u_vars未

40、初始化段file2.objtable_1初始化段FFT初始化段file1 .textfile2 .textfile1 .datafile2 .datafile1 table_1file2 table_1file2 FFTunusedfile1 .bssfile2 .bssfile1 u_varsfile2 u_varsunusedRAMROM 文件的鏈接 重定位重定位連接器在處理每一個(gè)段時(shí),原來的段地址都是從地址連接器在處理每一個(gè)段時(shí),原來的段地址都是從地址0000開始,所有開始,所有可重定位符號(hào)(標(biāo)號(hào))均相對(duì)于它們的段內(nèi)地址。可重定位符號(hào)(標(biāo)號(hào))均相對(duì)于它們的段內(nèi)地址。連接器通過下列措施來重

41、定位段連接器通過下列措施來重定位段1)把各段定位到存儲(chǔ)器內(nèi),從適當(dāng)?shù)牡刂烽_始;)把各段定位到存儲(chǔ)器內(nèi),從適當(dāng)?shù)牡刂烽_始;2)調(diào)整符號(hào)(標(biāo)號(hào))值對(duì)應(yīng)于新的段地址;)調(diào)整符號(hào)(標(biāo)號(hào))值對(duì)應(yīng)于新的段地址;3)調(diào)整對(duì)已重定位符號(hào)的引用,以便反映調(diào)整后的符號(hào)值)調(diào)整對(duì)已重定位符號(hào)的引用,以便反映調(diào)整后的符號(hào)值匯編器在需要引用重新定位的符號(hào)處留了重定位的入口;匯編器在需要引用重新定位的符號(hào)處留了重定位的入口;連接器在符號(hào)重定位時(shí),利用這些入口修正對(duì)符號(hào)的引用;連接器在符號(hào)重定位時(shí),利用這些入口修正對(duì)符號(hào)的引用;例:重定位前 重定位后SPC代碼 PC代碼.refX0000.text00007980BY020

42、0798000010004020102040002bf80LACCX0202bf800003 0000! 020300100004be22Y:IDLE0204be22說明:說明:1)X,Y都是需重定位的,都是需重定位的, Y在本模塊定義,在本模塊定義,X在另一個(gè)模塊定義;在另一個(gè)模塊定義;2)程序進(jìn)行匯編時(shí),)程序進(jìn)行匯編時(shí), X值為值為0(外部引用),(外部引用),Y值為值為0004(段內(nèi)地址)(段內(nèi)地址)3)形成兩個(gè)重定位入口:)形成兩個(gè)重定位入口:X, Y.text段對(duì)段對(duì)X的引用是外部引用(列表文件中用的引用是外部引用(列表文件中用“ !”表示)表示) 對(duì)對(duì)Y的引用是內(nèi)部引用(列表文件

43、中用的引用是內(nèi)部引用(列表文件中用“ ”表示)表示) 4)假設(shè):)假設(shè):X被重定位到地址被重定位到地址 10h .text段被重定位后從地址段被重定位后從地址 0200h開始開始四、外部符號(hào)的定義與引用四、外部符號(hào)的定義與引用所謂外部符號(hào)是在一個(gè)模塊定義,在另一個(gè)模塊引用的符號(hào)所謂外部符號(hào)是在一個(gè)模塊定義,在另一個(gè)模塊引用的符號(hào)外部符號(hào)定義與引用的偽指令:外部符號(hào)定義與引用的偽指令:.def 在當(dāng)前模塊中定義,并可在別的模塊中使用的符號(hào)在當(dāng)前模塊中定義,并可在別的模塊中使用的符號(hào).ref 在當(dāng)前模塊中使用,但在別的模塊中定義的符號(hào)在當(dāng)前模塊中使用,但在別的模塊中定義的符號(hào).global 全局符

44、號(hào)全局符號(hào)例:.defX; 定義 X.refY; 引用 YX:ADD056hMPYY6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)的機(jī)器語言目標(biāo)文件文件匯編器的功能:匯編器的功能: 將匯編語言源程序匯編成可重定位的目標(biāo)文件(將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)文件) 如果需要的話,可生成一個(gè)列表文件(如果需要的話,可生成一個(gè)列表文件(.lst文件)文件) 將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管

45、理)來管理 定義和引用符號(hào),需要的話可形成一張交叉引用表定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行匯編程序(匯編器)的運(yùn)行dspainput file object file listing file -options dspa 匯編程序名 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)的機(jī)器語言目標(biāo)文件文件匯編器的功能匯編器的功能: 將匯編語言源程序匯編成可重定位的目標(biāo)文件(將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)文件) 如果需要的話,可生成一個(gè)列表文件(如果需要

46、的話,可生成一個(gè)列表文件(.lst文件)文件) 將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理)來管理 定義和引用符號(hào),需要的話可形成一張交叉引用表定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行匯編程序(匯編器)的運(yùn)行dspainput file object file listing file -options input file 輸入?yún)R編語言源程序文件名 (.asm 文件)(擴(kuò)展名可省缺) 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)

47、是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)的機(jī)器語言目標(biāo)文件文件匯編器的功能匯編器的功能: 將匯編語言源程序匯編成可重定位的目標(biāo)文件(將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)文件) 如果需要的話,可生成一個(gè)列表文件(如果需要的話,可生成一個(gè)列表文件(.lst文件)文件) 將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理)來管理 定義和引用符號(hào),需要的話可形成一張交叉引用表定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行匯編程序(匯編器)的運(yùn)行dspainput fil

48、e object file listing file -options object file 命名創(chuàng)建的目標(biāo)文件名 (.obj 文件)(若不提供文件名,則以 “ 輸入文件名.obj ”來命名) 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機(jī)器語言目標(biāo)的機(jī)器語言目標(biāo)文件文件匯編器的功能:匯編器的功能: 將匯編語言源程序匯編成可重定位的目標(biāo)文件(將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)文件) 如果需要的話,可生成一個(gè)列表文件(如果需要的話,可生成一個(gè)列表文件(.lst文件)文件) 將程序代碼分成若干個(gè)段

49、,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理)來管理 定義和引用符號(hào),需要的話可形成一張交叉引用表定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行匯編程序(匯編器)的運(yùn)行dspainput file object file listing file -options listing file 命名產(chǎn)生的列表文件名 (.lst 文件)(若不提供文件名,則以 “ 輸入文件名.lst ”來命名) 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成CO

50、FF的機(jī)器語言目標(biāo)的機(jī)器語言目標(biāo)文件文件匯編器的功能:匯編器的功能: 將匯編語言源程序匯編成可重定位的目標(biāo)文件(將匯編語言源程序匯編成可重定位的目標(biāo)文件(.obj文件)文件) 如果需要的話,可生成一個(gè)列表文件(如果需要的話,可生成一個(gè)列表文件(.lst文件)文件) 將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器將程序代碼分成若干個(gè)段,每個(gè)段的目標(biāo)代碼都有一個(gè)段程序計(jì)數(shù)器(SPC)來管理)來管理 定義和引用符號(hào),需要的話可形成一張交叉引用表定義和引用符號(hào),需要的話可形成一張交叉引用表匯編程序(匯編器)的運(yùn)行匯編程序(匯編器)的運(yùn)行dspainput file object file

51、 listing file -options -options 選項(xiàng)例: -l 產(chǎn)生列表文件-x產(chǎn)生交叉引用表列表文件:10000.data200010011coeff.word011h, 022h, 033h;創(chuàng)建.data 段0002 00220003003330000.bssvar1, 1 ;在.bss段中為兩個(gè)40001.bssbuffer, 10 ;變量保留空間500030123ptr.word0123h ;繼續(xù)建.data 段60000.text ;創(chuàng)建.text 段70000200fadd:LAC 0Fh80001d003aloop:SBLK#10002000180003f280

52、BLEZaloop00040001900056000SACLvar1, 0100004.data;繼續(xù)創(chuàng)建.data 段11000400aaivals.word0AAh, 0BBh000500bb 行號(hào)SPC 目標(biāo)代碼 源程序語句6.6 程序的鏈接程序的鏈接鏈接器的主要任務(wù):鏈接器的主要任務(wù):根據(jù)鏈接命令或鏈接命令文件(根據(jù)鏈接命令或鏈接命令文件(.cmd文件)把文件)把1個(gè)或多個(gè)目個(gè)或多個(gè)目標(biāo)文件標(biāo)文件(文件名文件名obj)鏈接起來,生成可執(zhí)行的輸出文件鏈接起來,生成可執(zhí)行的輸出文件(文件文件名名.out)和存儲(chǔ)器映像文件(和存儲(chǔ)器映像文件(.map文件)文件)鏈接器所做工作:鏈接器所做工作

53、:把各個(gè)段配置到目標(biāo)系統(tǒng)的存儲(chǔ)器把各個(gè)段配置到目標(biāo)系統(tǒng)的存儲(chǔ)器對(duì)段和符號(hào)進(jìn)行重定位,給它們指定一個(gè)最終的地址對(duì)段和符號(hào)進(jìn)行重定位,給它們指定一個(gè)最終的地址解決輸入文件之間未定義的外部引用解決輸入文件之間未定義的外部引用鏈接器的運(yùn)行:鏈接器的運(yùn)行:dsplnk file1.obj file2.obj -o file.out或dsplnk linker.cmd 鏈接命令文件鏈接命令文件鏈接命令文件的擴(kuò)展名為鏈接命令文件的擴(kuò)展名為 .cmd,包含以下內(nèi)容:,包含以下內(nèi)容:1)輸入文件名:要鏈接的目標(biāo)文件、歸檔庫文件或其他命令文件)輸入文件名:要鏈接的目標(biāo)文件、歸檔庫文件或其他命令文件2)鏈接器選項(xiàng))

54、鏈接器選項(xiàng)3)MEMORY 和和 SECTIONS 鏈接器偽指令鏈接器偽指令4)賦值語句:定義并賦值給全局符號(hào))賦值語句:定義并賦值給全局符號(hào)5)注釋:用)注釋:用/*和和*/定界符加注釋定界符加注釋鏈接命令文件(鏈接命令文件(.cmd文件)舉例:文件)舉例:a.Obj b.obj c.obj /* input filename */-o prog.out -m prog.map /* options */MEMORYRAM:origin = 0100h length = 0100hROM:origin = 0200h length = 0100hSECTIONS.text ROM.data

55、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頁 通常 P

56、AGE0 定義為程序存儲(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,

57、 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ǔ)器的配置MEM

58、ORY偽指令的一般句法: 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ù)的

59、地址范圍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ù)的地址范圍T

60、MS320C2000芯片的型號(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未定義PA

溫馨提示

  • 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)論