TMS320C5000系列DSP原理及應(yīng)用(第二版)課件4-3(1)匯編語(yǔ)言程序開(kāi)發(fā)_第1頁(yè)
TMS320C5000系列DSP原理及應(yīng)用(第二版)課件4-3(1)匯編語(yǔ)言程序開(kāi)發(fā)_第2頁(yè)
TMS320C5000系列DSP原理及應(yīng)用(第二版)課件4-3(1)匯編語(yǔ)言程序開(kāi)發(fā)_第3頁(yè)
TMS320C5000系列DSP原理及應(yīng)用(第二版)課件4-3(1)匯編語(yǔ)言程序開(kāi)發(fā)_第4頁(yè)
TMS320C5000系列DSP原理及應(yīng)用(第二版)課件4-3(1)匯編語(yǔ)言程序開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第四章匯編語(yǔ)言程序開(kāi)發(fā)主講:?jiǎn)倘鹌?/p>

西安交通大學(xué)信通學(xué)院email:rpqiao@

主要內(nèi)容:TMS320C54x匯編語(yǔ)言的基本概念匯編語(yǔ)言程序設(shè)計(jì)的基本方法匯編語(yǔ)言程序的編輯、匯編和鏈接過(guò)程程序示例匯編源程序〈一〉來(lái)源C語(yǔ)言代數(shù)指令程序宏源文件C編譯器代數(shù)式指令翻譯器歸檔(將若干宏文件集中為一個(gè)宏文件庫(kù))匯編源程序宏庫(kù)匯編器〈二〉匯編語(yǔ)言程序的編寫(xiě)方法1.語(yǔ)句格式:見(jiàn)P80[標(biāo)號(hào)][:]助記符[操作數(shù)][;注釋]2.匯編命令

見(jiàn)83頁(yè)表4-3常用的匯編命令3.宏命令

見(jiàn)88頁(yè)4.分析程序(P90)1.語(yǔ)句格式[標(biāo)號(hào)][:]助記符[操作數(shù)][;注釋]2.匯編命令

命令句法:

.text[段起點(diǎn)].data[段起點(diǎn)] ;若[]缺省,SPC=0.bss符號(hào),字?jǐn)?shù);例:.bssx,2.sect“段名”[,段起點(diǎn)]符號(hào).usect“段名”,字?jǐn)?shù)例:STACK.usect“STACK”,10H.wordvalue1[,…,valuen];例:table:

.word3,23.宏命令宏定義格式:宏命令名.macro<形式參數(shù)>

.endm宏調(diào)用格式:宏命令名<實(shí)際參數(shù)>

宏展開(kāi)實(shí)際參數(shù)傳遞給形式參數(shù),宏定義代替宏調(diào)用語(yǔ)句宏體宏定義、宏調(diào)用和宏展開(kāi):舉例宏定義:

add3 .macro p1,

p2,

p3,

ADDRP

LD P1,

A

ADD P2,

A

ADD P3,

A

STL A,

ADDRP

.endm宏調(diào)用:

add3 abc, def, ghi, adr 宏展開(kāi):

LD abc, A ADD def, A ADD ghi, A STL A, adr4.2 匯編程序設(shè)計(jì)的基本方法

匯編源程序(.asm)一般由數(shù)據(jù)段、堆棧段、代碼段組成。

程序的基本結(jié)構(gòu)有四種:順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)

匯編語(yǔ)言程序框架如下:

.mmregsSTACK.usect"STACK",10h

.data

<數(shù)據(jù)、變量在此定義>

.text ;codefollows...start:STM#0,SWWSR;addsnowaitstatesSTM#STACK+10h,SP

<加入你自己的程序段>end:Bend.end

另外,.bss用于為變量保留一塊存儲(chǔ)空間,.sect常用于定義中斷向量表。

4.2.2順序結(jié)構(gòu)

例1試編制程序,求出下列公式中z的值,z=(x+y)*8-w

.title"ex41.asm".mmregsSTACK.usect"STACK",10h;allocatespaceforstack.bssx,1;allocate4wordforvariates.bssy,1.bssw,1.bssz,1.defstart

.data

table:.word6,7,9;datafollows....text ;codefollows...start:STM#0,SWWSR;addsnowaitstatesSTM#STACK+10h,SP;setstackpointerSTM#x,AR1;AR1pointtoaRPT#2;move3valuesMVPDtable,*AR1+;fromprogrammemory;intodatamemoryLD@x,AADD@y,A;A=x+y

LDA,3;A=(x+y)*8SUB@w,A;A=(x+y)*8-wSTLA,@zend:Bend.end返回4.2.3分支結(jié)構(gòu)基本的程序控制與轉(zhuǎn)移指令,實(shí)行分支轉(zhuǎn)移,循環(huán)控制及子程序操作1、分支改寫(xiě)PCBnextBACCsrcBCnext,cnd分支舉例標(biāo)號(hào):條件滿足?處理NYIF…THEN結(jié)構(gòu)程序結(jié)構(gòu):

條件轉(zhuǎn)移指令(BC標(biāo)號(hào),cond)

處理體

標(biāo)號(hào):其他指令

…例2:試編制程序,求一個(gè)數(shù)的絕對(duì)值,并送回原處。

.mmregsSTACK.usect"STACK",10h;allocatespaceforstack .bssx,1 ;allocate1wordforvariates

.defstart .datatable:.word-7 ;datafollows... .text;codefollows...start: STM#0,SWWSR;addsnowaitstates STM#STACK+10h,SP;setstackpointer

STM#x,AR1 MVPDtable,*AR1 LD*AR1,A

BCend,AGT

;若A>0,則轉(zhuǎn)至end,否則往下執(zhí)行

ABSA STLA,@xend:Bend .end循環(huán)舉例4.2.4循環(huán)結(jié)構(gòu)條件算符(cnd)LEQGEQEQNEQLTGTNOVOVTCNTCCNCBIONBIO1.2.說(shuō)明:1.第一組:組內(nèi)兩類(lèi)條件可以與/或,當(dāng)選兩條件時(shí),累加器必須是同一個(gè)。2.第二組:可以從組內(nèi)3類(lèi)算符中各選一個(gè)條件算符。3.組與組之間只能“或”。循環(huán)程序設(shè)計(jì)主要用于某些需要重復(fù)進(jìn)行的操作,簡(jiǎn)化程序,節(jié)約內(nèi)存。主要使用循環(huán)指令BANZ等循環(huán)指令。循環(huán)程序的設(shè)計(jì)可分為設(shè)置循環(huán)初始狀態(tài)、循環(huán)體和循環(huán)控制條件三部分。

返回

循環(huán)程序(1)DO…UNTIL<條件>結(jié)構(gòu)先執(zhí)行,再判斷條件。工作部分至少執(zhí)行一次。初始化循環(huán)體循環(huán)控制繼續(xù)循環(huán)?YN(2)DOWHILE<條件>結(jié)構(gòu)先判斷條件,再執(zhí)行。工作部分有可能一次都不執(zhí)行。初始化循環(huán)體循環(huán)控制繼續(xù)循環(huán)?YN主要是指設(shè)置循環(huán)次數(shù)的計(jì)數(shù)初值,以及其他為能使循環(huán)體正常工作而設(shè)置的初始狀態(tài)等。

返回設(shè)置循環(huán)初始狀態(tài)循環(huán)體是循環(huán)操作(重復(fù)執(zhí)行)的部分,包括循環(huán)的工作部分及修改部分。循環(huán)的工作部分是實(shí)現(xiàn)程序功能的主要程序段;循環(huán)的修改部分是指當(dāng)程序循環(huán)執(zhí)行時(shí),對(duì)一些參數(shù)如地址、變量的有規(guī)律的修正。

循環(huán)體返回循環(huán)控制部分循環(huán)控制部分是循環(huán)程序設(shè)計(jì)的關(guān)鍵。每個(gè)循環(huán)程序必須選擇一個(gè)控制循環(huán)程序運(yùn)行和結(jié)束的條件。要點(diǎn):①找出循環(huán)的規(guī)律。②確定控制循環(huán)的方法。

注意:循環(huán)可以嵌套(多重循環(huán)),但多個(gè)循環(huán)體之間不能交叉,控制條件不能混淆。返回

分析:例3:試編制程序,在4項(xiàng)乘積aixi(i=1,2,3,4)中

找出最大值,并存放在累加器A中。 .mmregsSTACK.usect"STACK",10h.bssa,4.bssx,4.defstart.datatable:.word1,2,3,4.word8,6,9,7.textstart:STM#0,SWWSRSTM#STACK+10h,SPSTM#a,AR1RPT#7MVPDtable,*AR1+STM#a,AR1STM#x,AR2

STM#2,AR3

LD*AR1+,TMPY*AR2+,A

;第一個(gè)乘積在累加器A中l(wèi)oop1:LD*AR1+,TMPY*AR2+,B ;其它乘積在累加器B中

MAXA;累加器A和B比較,選大的存在A中

BANZloop1,*AR3-

;此循環(huán)中共進(jìn)行3次乘法和比較end:Bend.end例9ex43.cmd文件(P108)

ex43.obj-oex43.out-mex43.map-estartMEMORY{PAGE0:EPROM:org=0E000h,len=100h

PAGE1:SPRAM:org=0060h,len=20hDARAM:org=0080h,len=100h}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}子程序調(diào)用將返回地址壓入堆棧CALLsubCALAsrcCCsub,cnd返回復(fù)原RETRCcnd4.2.5子程序結(jié)構(gòu)子程序的定義子程序是一個(gè)獨(dú)立的程序段,具有確定的功能,可被其他程序調(diào)用,調(diào)用它的程序一般為主程序。其特點(diǎn)是:模塊化程序設(shè)計(jì),省內(nèi)存、省時(shí)間(研制周期)。通用功能程序編成子程序方便用戶(hù)

一個(gè)子程序可以被其他程序所調(diào)用,它最后一條指令總是返回指令,用以控制子程序在執(zhí)行完畢后,返回主程序。子程序的調(diào)用子程序的結(jié)構(gòu)格式:子程序名:

RET子程序體例4(整數(shù)的)求乘法累加運(yùn)算y=a1*x1+a2*x2+a3*x3+a4*x4*************************************************EX44.asmy=a1*x1+a2*x2+a3*x3+a4*x4*************************************************.title"EX44.asm".mmregsSTACK.usect"STACK",10h;allocatespaceforstack.bssa,4;allocate9wordforvariates.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4;datafollows....word8,6,4,2

.text;codefollows...start:STM#0,SWWSR;addsnowaitstatesSTM#STACK+10h,SP;setstackpointerSTM#a,AR1;AR1pointtoaRPT#7;move8valuesMVPDtable,*AR1+;fromprogrammemory;intodatamemoryCALLSUM;callSUMsubrotineend:BendSUM:STM#a,AR3;ThesubrotinelmplememtSTM#x,AR4;multiply--accumulateRPTZA,#3MAC*AR3+,*AR4+,ASTLA,@yRET.end例:浮點(diǎn)運(yùn)算P94例5目的:為了擴(kuò)大數(shù)據(jù)的范圍和精度,采用浮點(diǎn)運(yùn)算,C54x是定點(diǎn)DSP,但它支持浮點(diǎn)運(yùn)算1.浮點(diǎn)的表示方法定點(diǎn)數(shù)=尾數(shù)2-(指數(shù))2.定點(diǎn)數(shù)浮點(diǎn)數(shù)步驟:EXPA;提取指數(shù)STT,EXPONENT;T中的指數(shù)存放到數(shù)存的指定單元中NORMA;規(guī)格化處理A=FFFFFFF001;按T中數(shù)值對(duì)A歸一化EXP

A

;T=A的冗余符號(hào)位數(shù)-8=27-8=13HNORM

A

;按T中數(shù)值對(duì)A歸一化1111111111111111111111111111000000000001

左移13H

尾數(shù)FF80080000H和指數(shù)13H注:冗余符號(hào)位-8,也就是為消去多余符號(hào)位而將累加器中的數(shù)值左移的位數(shù),當(dāng)累加器數(shù)值超過(guò)32位時(shí),指數(shù)是一個(gè)負(fù)值。3.浮點(diǎn)數(shù)相乘:指數(shù)相加;尾數(shù)相乘即[m1*2-(e1)]*[m2*2-(e2)]=(m1*m2)*2-(e1+e2)4.浮點(diǎn)數(shù)定點(diǎn)數(shù)按指數(shù)值將尾數(shù)右移(指數(shù)為負(fù)時(shí)左移)就可以了編寫(xiě)浮點(diǎn)乘法程序,完成

x1*x2=0.3*(-0.8)運(yùn)算。程序中所用數(shù)據(jù)變量如下:x1:定點(diǎn)被乘數(shù);e1:被乘數(shù)的指數(shù);m1:被乘數(shù)的尾數(shù);x2:定點(diǎn)乘數(shù);e2:乘數(shù)的指數(shù) ;m2:乘數(shù)的尾數(shù);ep:乘積的指數(shù) ;mp:乘積的尾數(shù) ;product:定點(diǎn)乘積 ;temp:暫存單元。首先將定點(diǎn)數(shù)x1、x2轉(zhuǎn)換為浮點(diǎn)數(shù),浮點(diǎn)數(shù)相乘即指數(shù)相加,尾數(shù)相乘,最后再將乘積(浮點(diǎn)數(shù))轉(zhuǎn)換為定點(diǎn)數(shù)。.title"EX45.asm".mmregsSTACK.usect"STACK",10h.bssx1,1.bssx2,1.bsse1,1.bssm1,1.bsse2,1.bssm2,1.bssep,1.bssmp,1.bssproduct,1.bsstemp,1.defstart.datatable:.word4*32768/10.word-6*32768/10.textstart:STM#0,SWWSRSTM#STACK+10h,SP;設(shè)置堆棧指針

MVPDtable,@x1;將x1、x2傳送至數(shù)據(jù)存儲(chǔ)器

MVPDtable+1,@x2

LD@x1,16,A;先將x1加載至A(31~16),因小數(shù)在高位EXPA ;提取指數(shù)

STT,@e1;保存x1的指數(shù)NORMA ;將x1規(guī)格化為浮點(diǎn)數(shù),按指數(shù)將尾數(shù)移位STHA,@m1

;保存x1的尾數(shù)

LD@x2,16,A

EXPASTT,@e2 ;保存x2的指數(shù)NORMASTHA,@m2

;保存x2的尾數(shù)CALLMULT ;調(diào)用浮點(diǎn)乘法子程序done:BdoneMULT:SSBXFRCT ;小數(shù)相乘消去冗余符號(hào)位SSBXSXM ;符號(hào)位擴(kuò)展LD@e1,A :指數(shù)相加ADD@e2,A STLA,@epLD@m1,T ;尾數(shù)相乘(有符號(hào)數(shù)),乘積左移1位MPY@m2,A EXPA ;對(duì)尾數(shù)乘積規(guī)格化STT,@tempNORMASTHA,@mp ;保存乘積尾數(shù)LD@temp,A ;修正乘積指數(shù),ep+temp=epADD@ep,ASTLA,@ep ;保存乘積指數(shù)NEGA ;乘積指數(shù)反號(hào),將浮點(diǎn)乘積轉(zhuǎn)換為定點(diǎn)數(shù)STLA,@tempLD@temp,TLD@mp,16,ANORMASTHA,@product ;保存定點(diǎn)乘積RET.end4.3匯編語(yǔ)言程序的編輯、匯編和鏈接過(guò)程圖4-1匯編語(yǔ)言程序的編輯、匯編和鏈接過(guò)程一個(gè)或多個(gè)TMS320源程序經(jīng)過(guò)匯編和鏈接,生成公共目標(biāo)文件格式的COFF可執(zhí)行文件。再通過(guò)軟件仿真或硬件在線仿真器的調(diào)試,最后將程序加載到用戶(hù)的應(yīng)用系統(tǒng)。本章4.3節(jié)~4.5節(jié)主要介紹匯編語(yǔ)言程序的.cmd文件編寫(xiě)方法。一主要的軟件開(kāi)發(fā)工具文本編輯器EDIT.COM(在driver:\dos子目錄下)。C54x匯編器ASM500.EXE(在driver:\C54x\asmlink子目錄下)。C54x鏈接器LNK500.EXE(在driver:\C54x\asmlink子目錄下)。軟件仿真器SIM54XW.EXE(在driver:\

C54x\sim子目錄下)。二鏈接連接命令文件(.cmd)

利用LNK500,根據(jù)鏈接文件命令對(duì)已匯編的一個(gè)或多個(gè)目標(biāo)文件(.obj)進(jìn)行鏈接,生成.map文件和.out文件。.cmd指出輸入文件,輸出文件程序段,數(shù)據(jù)段,堆棧段,復(fù)位向量,中斷向量安排在什么地方

程序M,數(shù)據(jù)M.cmd指明(.text,.data,.bss,及STACK)入口地址三調(diào)試對(duì).out文件的調(diào)試手段:軟件仿真器Sim54xw。C54xEVM評(píng)估板上調(diào)試。XDS510在線仿真器上進(jìn)行調(diào)試。四固化程序HEX500(格式轉(zhuǎn)換器)對(duì)ROM、EPROM編程,安裝到用戶(hù)程序的應(yīng)用系統(tǒng)中。4.4 匯編器4.4.1COFF的一般概念匯編器(Assembler)將匯編語(yǔ)言源文件匯編成機(jī)器語(yǔ)言COFF(CommonObjectFileFormat)目標(biāo)文件。COFF的用途:會(huì)使模塊化編程和管理變得更加方便,編程時(shí)按代碼段和數(shù)據(jù)段來(lái)考慮問(wèn)題,匯編器和鏈接器都有一些命令建立并管理各種各樣的段所謂段(Section),是指連續(xù)地占有存儲(chǔ)空間的一個(gè)代碼塊或數(shù)據(jù)塊。

一、COFF文件中的段P99

.text:已初始化段(通常包含可執(zhí)行代碼).data:已初始化段(通常包含初始化數(shù)據(jù)).bss:未初始化段(通常為未初始化變量保留存儲(chǔ)空間)

此外,自定義段:.sect(已初始化段).usect(未初始化段)命令句法:已初始化段.text[段起點(diǎn)].data[段起點(diǎn)] ;若[]缺省,SPC=0。.bss 符號(hào),字?jǐn)?shù)未初始化段.sect“段名”[,段起點(diǎn)].usect“段名”,字?jǐn)?shù)說(shuō)明:符號(hào)——對(duì)應(yīng)于保留的存儲(chǔ)空間第一個(gè)字的變量名稱(chēng)。字?jǐn)?shù)——段中保留多少個(gè)存儲(chǔ)單元。段名——為段所起名字。段有兩種:已初始化段:包含有數(shù)據(jù)或程序代碼。未初始化段:為未初始化的數(shù)據(jù)保留存儲(chǔ)空間,通常定位到RAM區(qū),存放變量匯編器將程序代碼和數(shù)據(jù)鏈接在一起,構(gòu)成目標(biāo)文件。鏈接器把各個(gè)段重新定位到目標(biāo)存儲(chǔ)器圖。二、匯編器對(duì)段的處理在編程時(shí),“段”沒(méi)有絕對(duì)定位,每個(gè)“段”都認(rèn)為是從0地址開(kāi)始的一塊連續(xù)的存儲(chǔ)空間。程序員只需要用“段”偽指令來(lái)組織程序的代碼和數(shù)據(jù),而無(wú)需關(guān)心這些“段”究竟定位于系統(tǒng)何處。

由于所有的“段”都是從0地址開(kāi)始,因此程序編譯完成后無(wú)法直接運(yùn)行。要讓程序正確運(yùn)行,必須對(duì)“段”進(jìn)行重新定位,即把各個(gè)段重新定位到目標(biāo)存儲(chǔ)器圖,這個(gè)工作由鏈接器完成

。匯編器對(duì)段的處理

匯編器用5條命令(.bss、.usect、.text、.data和.sect)識(shí)別匯編語(yǔ)言程序的各個(gè)部分。

匯編器第一次遇到新“段”時(shí),將該“段”的段程序計(jì)數(shù)器(SPC)置為0,并將隨后的程序代碼或數(shù)據(jù)順序編譯進(jìn)該“段”中。匯編器遇到同名“段”時(shí),將它們合并,然后將隨后的程序代碼或數(shù)據(jù)順序編譯進(jìn)該“段”中。

匯編器為每個(gè)段都安排了一個(gè)單獨(dú)的段程序計(jì)數(shù)器(SPC)。SPC表示一個(gè)程序代碼或數(shù)據(jù)段內(nèi)的當(dāng)前地址。最初,匯編器將每個(gè)SPC置為0。當(dāng)代碼或數(shù)據(jù)被加到一個(gè)段內(nèi)時(shí),相應(yīng)的SPC的值就增加。如果繼續(xù)匯編進(jìn)一個(gè)段,則匯編器會(huì)記住前面的SPC值,并在該點(diǎn)繼續(xù)增加SPC的值。鏈接器在鏈接時(shí)要對(duì)每個(gè)段進(jìn)行重新定位

。列表文件中每行由4個(gè)區(qū)域組成即:Field1:源程序的行號(hào)。Field2:段程序計(jì)數(shù)器SPC。Field3:目標(biāo)代碼。Field4:源程序。見(jiàn)P100例64.5 鏈接器任務(wù):1.將各個(gè)段配置到目標(biāo)系統(tǒng)的存儲(chǔ)器。

2.為各個(gè)輸出段選定存儲(chǔ)器地址。3.解決輸入文件之間未定義的外部引用。 鏈接器的主要功能就是對(duì)程序定位,是一種相對(duì)的程序定位方式。

程序的定位方式有3種:編譯時(shí)定位。鏈接時(shí)定位。加載時(shí)定位。編譯時(shí)定位MCU系統(tǒng)采用編譯時(shí)定位,編程時(shí)由ORG語(yǔ)句確定代碼塊和數(shù)據(jù)塊的絕對(duì)地址,編譯器以此地址為首地址,連續(xù)、順序地存放該代碼塊或數(shù)據(jù)塊。編譯時(shí)定位簡(jiǎn)單、容易上手,但程序員必須熟悉硬件資源,模塊化編程差,工程化不支持。

鏈接時(shí)定位DSP系統(tǒng)采用鏈接時(shí)定位,編程時(shí)由“段”偽指令,以區(qū)分不同的代碼塊和數(shù)據(jù)塊;編譯器每遇到一個(gè)“段”偽指令,從0地址重新開(kāi)始一個(gè)代碼塊或數(shù)據(jù)塊;鏈接器將同名的“段”合并,并按.cmd文件中的“段”命令進(jìn)行實(shí)際的定位。鏈接時(shí)定位程序員不必熟悉硬件資源,模塊化編程強(qiáng),便于工程化管理,可將軟件開(kāi)發(fā)人員和硬件開(kāi)發(fā)人員基本上分離開(kāi),但定位靈活、上手較難。

加載時(shí)定位PC機(jī)系統(tǒng)采用加載時(shí)定位,編程、編譯和鏈接時(shí)均未對(duì)系統(tǒng)進(jìn)行絕對(duì)定位,而是在程序運(yùn)行前,由操作系統(tǒng)對(duì)程序進(jìn)行重定位,并加載到存儲(chǔ)空間中。加載時(shí)定位必須要有操作系統(tǒng)支持,便于程序的模塊化編程及工程化管理支持。

1、鏈接器對(duì)段的處理MEMORY命令:此條命令用來(lái)定義目標(biāo)系統(tǒng)的存儲(chǔ)器配置圖。包括對(duì)存儲(chǔ)器各部分命名,以及規(guī)定他們的起始地址和長(zhǎng)度?;揪浞ㄈ缦拢涸斍橐?jiàn)P105名稱(chēng):orign=常數(shù),length=常數(shù);SECTIONS命令。此命令告訴鏈接地址器如何將輸入段組合成輸出段,以及將輸出段放在存儲(chǔ)器的什么位置?;揪浞ㄈ缦拢涸斍橐?jiàn)P106名稱(chēng):>某存儲(chǔ)區(qū)目標(biāo)文件目標(biāo)存儲(chǔ)器.bss.data.textSPRAMEPROM目標(biāo)文件中的段與目標(biāo)存儲(chǔ)器之間的關(guān)系.cmd文件由3部分組成:輸入/輸出定義:這一部分可通過(guò)CCS的“BuildOptions…”菜單設(shè)置.obj文件:鏈接器要鏈接的目標(biāo)文件.lib文件:鏈接器要鏈接的庫(kù)文件.map文件:鏈接器生成的交叉索引文件.out文件:鏈接器生成的可執(zhí)行代碼鏈接器選項(xiàng)MEMORY命令:描述系統(tǒng)實(shí)際的硬件資源SECTIONS命令:描述“段”如何定位2、鏈接器命令文件lab1.cmdlab1.obj-olab1.out-mlab1.map-estartMEMORY{PAGE0:EPROM:org=0E000h,len=100h

PAGE1:SPRAM:org=0060h,len=20hDARAM:org=0080h,len=100h}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}3、重定位P109~110

匯編器處理每個(gè)段都是從0開(kāi)始,而所需要重新定位的符號(hào)(標(biāo)號(hào))在段內(nèi)都是相對(duì)于地址0的。實(shí)際上,所有段都不可能從存儲(chǔ)器中的地址0單元開(kāi)始的,因此鏈接器必須通過(guò)以下方法對(duì)各個(gè)段進(jìn)行重新定位:將各個(gè)段定位到存儲(chǔ)器圖中,這樣一來(lái)每一個(gè)段都從一個(gè)恰當(dāng)?shù)牡刂烽_(kāi)始。將符號(hào)的數(shù)值調(diào)整到相對(duì)于新的段地址的數(shù)值。調(diào)整對(duì)重定位后符號(hào)的引用。4、COFF文件中的符號(hào)外部符號(hào):在一個(gè)模塊中定義,又可在另一個(gè)模塊中引用的符號(hào),可用下列符號(hào):.def:在當(dāng)前模塊中定義,并可在別的模塊中使用的符號(hào)。.ref:在當(dāng)前模塊中使用,但在別的模塊中定義的符號(hào)。.global:可以在以上任意一種情況。返回4.7 程序示例

多個(gè)文件鏈接

P117

正弦波發(fā)生器

P1211、多個(gè)文件鏈接將復(fù)位和中斷向量文件vectors.asm和ex421.asm兩個(gè)文件相鏈接。對(duì)ex42.asm文件進(jìn)行修改:增加.def start,INT_2增加中斷服務(wù)程序INT_2開(kāi)放中斷RSBX INTMSTM #0004,IMR分別對(duì)vectors.asm和ex421.asm兩個(gè)文件進(jìn)行匯編,并對(duì)各自生成的兩個(gè)目標(biāo)文件vectors.obj和ex421.obj進(jìn)行鏈接。

lnk500ex421.cmd修改ex42.cmd。輸入文件增加vectors.objMEMORYPAGE0SECTIONS在MEMORYPAGE0中增加:VECS:org=0FF80H,len=4VECS1:org=0FFC8H,len=4在SECTIONS中增加:.vectors:>VECSPAGE0INT_2:>VECS1PAGE0********************************** vectors.asm ** Resetvector **********************************.title"vectors.asm"

*******Reset-Vector*********.refstart .sect".vectors"Bstart

*******Interrupt-Vector********.refINT_2.sect"INT_2"BIN

溫馨提示

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