版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章TMS320C54x匯編語言程序設(shè)計4.1TMS320C54x匯編語言的基本概念
4.2TMS320C54x匯編語言程序設(shè)計的基本方法4.3TMS320C54x匯編語言程序的編輯、匯編與鏈接過程4.4匯編器
4.5鏈接器4.6Simulator的使用方法4.7匯編程序舉例4.1TMS320C54x匯編語言的基本概念4.1.1TMS320C54x匯編語句的組成匯編語言源程序中的每一行語句都可以由四部分組成,句法格式如下:[標(biāo)號][:]助記符[操作數(shù)][;注釋]其中,[]為選項。書寫規(guī)則如下:(1)所有語句必須以標(biāo)號、空格、星號(*)或分號開始。(2)所有包含偽指令的語句必須在一行內(nèi)完全指定。(3)若使用標(biāo)號,則標(biāo)號必須從第一列開始。(4)語句的每部分必須用一個或多個空格分開,Tab鍵與空格等效。1.標(biāo)號所有指令或大多數(shù)偽指令前面都可帶有語句標(biāo)號,供本程序的其他部分或其他程序調(diào)用。標(biāo)號是任選項,標(biāo)號后可以加也可以不加冒號(:)。標(biāo)號必須從第一列開始,其最多可長達(dá)32個字符(A~Z,a~z,0~9,_和$),但第一個字符不能是數(shù)字。引用標(biāo)號時,標(biāo)號的大小寫必須一致,標(biāo)號的值就是段程序計數(shù)器(SPC)的當(dāng)前值。若不用標(biāo)號,則第一個字母必須為空格、分號或星號(*)。2.助記符助記符跟在標(biāo)號的后面。助記符不能從第一列開始。助記符包含指令、偽指令、宏命令和宏調(diào)用。作為指令,一般用大寫;偽指令和宏命令則以句號(.)開始,且為小寫。偽指令可以形成常數(shù)和變量,當(dāng)用它控制匯編和鏈接過程時,可以不占存儲空間。3.操作數(shù)操作數(shù)是指指令中的操作數(shù)或偽指令中定義的內(nèi)容。操作數(shù)之間必須用逗號(,)分開。有的指令無操作數(shù),如指令NOP。指令中的操作數(shù)可以是寄存器、地址、常數(shù)、算術(shù)或邏輯表達(dá)式。4.注釋注釋從分號(;)開始,可以放在指令或偽指令的后面,也可以單獨占一行或數(shù)行。注釋是任選項。如果注釋從第1列開始,也可以用星號(*)。4.1.2TMS320C54x匯編語言中的常數(shù)、字符串、符號與表達(dá)式1.常數(shù)和字符串常數(shù)就是指令中出現(xiàn)的那些固定值。匯編器支持7種類型的常數(shù):二進(jìn)制數(shù)、十進(jìn)制數(shù)、八進(jìn)制數(shù)、十六進(jìn)制數(shù)、字符常數(shù)、字符串和浮點常數(shù)。①二進(jìn)制數(shù):二進(jìn)制數(shù)字(0或1),其后綴為B(或b)。②十進(jìn)制數(shù):用數(shù)字0~9表示,無后綴。③八進(jìn)制數(shù):用數(shù)字0~7表示,其后綴為Q或q。④十六進(jìn)制數(shù):用數(shù)字0~9及字母A~F表示,其后綴為h或H。⑤字符常數(shù):是由單引號(‘’)括起來的1或2個字符組成的字符串,每個字符在內(nèi)部表示為8位ASCII碼。⑥字符串:是由雙引號(“”)括起來的一串字符。⑦浮點常數(shù):是一串十進(jìn)制數(shù),可帶小數(shù)點、分?jǐn)?shù)和指數(shù)部分。2.符號符號用作標(biāo)號、常數(shù)和替代符號。符號名可以是長達(dá)200個字符的字母(A~Z,a~z)、數(shù)字(0~9)加上$或下劃線(_)。第一個字符不能是數(shù)字,符號中間不能有空格。符號分大小寫,例如:Abc。3.表達(dá)式1)運算順序影響表達(dá)式運算順序的三個主要因素是:圓括號、優(yōu)先級和同級運算順序。圓括號內(nèi)的表達(dá)式最先運算,不能用{}或[]來代替()。
TMS320C54x匯編器的優(yōu)先級使用與C語言類似,優(yōu)先級高的運算先執(zhí)行。表4-1給出了表達(dá)式中可用的運算符及優(yōu)先級。表4-1表達(dá)式的運算符及優(yōu)先級符號操作計算順序+、?、~取正、取負(fù)、按位求補(bǔ)從右到左*、/、%乘、除、求模從左到右<<、>>左移、右移從左到右+、?加、減從左到右<、<=、>、>=小于、小于等于、大于、大于等于從左到右!=、=不等于、等于從左到右&按位與從左到右^按位異或從左到右|按位或從左到右2)表達(dá)式溢出在匯編的過程中執(zhí)行算術(shù)運算后,匯編器將檢查溢出狀態(tài)。一旦出現(xiàn)上溢和下溢,它都發(fā)出值被截斷了的警告信息,但在做乘法時,匯編器不檢查溢出狀態(tài)。3)條件表達(dá)式匯編器在任何表達(dá)式中都支持關(guān)系操作,這對條件匯編特別有用。關(guān)系運算符如下:=(等于)==(等于) !=(不等于) >=(大于等于)<=(小于等于)>(大于)<(小于)4)表達(dá)式的合法性表達(dá)式在使用符號時,匯編器對符號在表達(dá)式中的使用具有一些限制,由于符號的屬性不同(即定義不同),使表達(dá)式存在合法性問題。符號按屬性可分為三種:外部符號、可重定位符號和絕對符號。由偽指令.global定義的符號和寄存器被稱為外部符號。在匯編和執(zhí)行階段,符號值、符號地址不同的是可重定位符號,相同的是絕對符號。含有乘、除法的表達(dá)式中只能使用絕對符號(其值不能改變)。表達(dá)式中不能使用未定義的符號。表4-2給出了表達(dá)式符號的合法性。表4-2表達(dá)式符號的合法性若A為…若B為…則A+B為…則A?B為…絕對絕對絕對絕對絕對外部外部非法絕對可重新定位可重新定位非法可重新定位絕對可重新定位可重新定位可重新定位可重新定位非法絕對可重新定位外部非法非法外部絕對外部外部外部可重新定位非法非法外部外部非法非法4.1.3TMS320C54x偽指令
TMS320C54x偽指令給程序提供數(shù)據(jù)、控制匯編過程。具體實現(xiàn)以下任務(wù): (1)將數(shù)據(jù)和代碼匯編到特定的段。 (2)為未初始化的變量保留存儲空間。 (3)控制展開列表的形式。 (4)存儲器初始化。
(5)匯編條件塊。 (6)定義全局變量。 (7)指定匯編器可以獲得宏的特定庫。 (8)檢查符號調(diào)試信息。常用的偽指令如表4-3所示。表4-3常用偽指令偽指令句法作用title.title“string”標(biāo)題名。例如:.title“example.asm”end.end結(jié)束偽指令,放在匯編語言源程序的最后text.text[段起點]包含可執(zhí)行程序代碼data.data[段起點]包含初始化數(shù)據(jù)int.intvalue1[,…,valuen]設(shè)置16位無符號整型量word.wordvalue1[,…,valuen]設(shè)置16位帶符號整型量bss.bss符號,字?jǐn)?shù)為未初始化的變量保留存儲空間sect.sect“段名”[,段起點]建立包含代碼和數(shù)據(jù)的自定義段usect符號.usect“段名”,字?jǐn)?shù)為未初始化的變量保留存儲空間的自定義段def.def變量1[,…,變量n]在當(dāng)前模塊中定義,并可在別的模塊中使用ref.ref變量1[,…,變量n]在當(dāng)前模塊中使用,但在別的模塊中定義global.global變量1[,…,變量n]可替代?.def和?.ref偽指令mmregs.mmregs定義存儲器映像寄存器的替代符號1.段定義偽指令 段定義偽指令有以下五個: ●.bss(未初始化段)●.data(已初始化段) ●.sect(已初始化段)●.text(已初始化段) ●.usect(未初始化段)1)未初始化段 .bss和.usect命令建立未初始化段。未初始化段就是TMS320C54x存儲器中的保留空間,它通常被定位在RAM區(qū)。在目標(biāo)文件中,這些段中沒有確切內(nèi)容,在程序運行時,可以利用這些存儲空間存放變量,變量一般存放于數(shù)據(jù)存儲器區(qū)域中。這兩條命令的句法如下:.bss符號,字?jǐn)?shù)符號.usect“段名”,字?jǐn)?shù)2)已初始化段.text、.data和.sect命令建立已初始化段。已初始化段包括可執(zhí)行代碼或已初始化的數(shù)據(jù)。在目標(biāo)文件中,這些段中都有確切內(nèi)容,當(dāng)加載程序時再將這些內(nèi)容放到TMS320C54x的存儲器中。每個初始化段都可以重新定位,也可以引用在其他段中定義的符號,鏈接器會自動處理段間的相互引用。這三條命令的句法如下:.text[段起點].data[段起點].sect"段名”[,段起點].text后是匯編語言程序的正文。經(jīng)匯編后,.text后的是可執(zhí)行程序代碼,一般存放于程序存儲器區(qū)域中。 .data后是已初始化數(shù)據(jù),有int和word兩種數(shù)據(jù)形式。由命令文件可以將定義的數(shù)據(jù)存放于程序或數(shù)據(jù)存儲器中。 .sect建立包含代碼和數(shù)據(jù)的自定義段,常用于定義中斷向量表。2.常數(shù)初始化偽指令常數(shù)初始化偽指令如表4-4所示。表4-4常數(shù)初始化偽指令偽指令句法作用bes.bessizeinbits保留確定數(shù)目的位space.spacesizeinbits保留確定數(shù)目的位byte.bytevalue1[,…,valuen]初始化一個或多個字節(jié)field.fieldvalue[,sizeinbits]將單個值放入當(dāng)前字的指定位域int.intvalue1[,…,valuen]設(shè)置16位無符號整型量word.wordvalue1[,…,valuen]設(shè)置16位帶符號整型量float.floatvalue1[,…,valuen]初始化一個或多個32位的數(shù)據(jù),為IEEE浮點數(shù)xfloat.xfloatvalue1[,…,valuen]初始化一個或多個32位的數(shù)據(jù),為IEEE單精度的浮點格式string.string“string1”[,…,“stringn”]初始化一個或多個字符pstring.pstring“string1”[,…,“stringn”]初始化一個或多個字符long.longvalue1[,…,valuen]設(shè)置32位無符號整型量xlong.xlongvalue1[,…,valuen]設(shè)置32位無符號整型量(1).bes和.space。匯編器對這些保留的位填0,將位數(shù)乘以16來實現(xiàn)保留字。(2).field。此指令可以把多個域打包成一個字,匯編器不會增加SPC的值,直至填滿一個字。(3).float和.xfloat。這兩個指令將32位浮點數(shù)存放在當(dāng)前段的連續(xù)字中,高位字先存。.float偽指令能自動按長字(偶地址)邊界排列,但.xfloat不能。(4).long和.xlong。這兩個指令將32位數(shù)存放在當(dāng)前段的連續(xù)字中,高位字先存。.long偽指令能自動按長字(偶地址)邊界排列,但.xlong不能。(5).string和.pstring。.string類似于.byte,把8位字符放到當(dāng)前段的連續(xù)字中,每8位字符占一個字。(6).int和.word。例如“table:.int1,2,3,4”,或例“table:.word8,6,4,2”。3.段程序計數(shù)器定位偽指令段程序計數(shù)器定位偽指令的句法如下:.align[sizeinbits]
該指令使段程序計數(shù)器SPC對準(zhǔn)1~128字的邊界,保證該指令后面的代碼從一個字或頁的邊界開始。不同的操作數(shù)代表了不同的含義:“1”表示讓SPC對準(zhǔn)字邊界;“2”表示讓SPC對準(zhǔn)長字/偶地址邊界;“128”表示讓SPC對準(zhǔn)頁邊界。當(dāng).align不帶操作數(shù)時,其缺省值為128,即對準(zhǔn)頁邊界。4.輸出列表格式偽指令表4-5列出了輸出列表格式偽指令。表4-5輸出列表格式偽指令偽指令句法作用length.lengthpagelength控制列表文件的頁長度list/nolist.list/.nolist打開/關(guān)閉輸出列表drlist/drnolist.drlist/.drnolist偽指令加入/不加入列表文件page.page在輸出列表中產(chǎn)生一個頁指針title.title“string”打印每一頁的標(biāo)題width.widthpagewidth設(shè)置列表文件的頁寬度fclist/fcnolist.fclist/?.fcnolist允許/禁止假條件塊出現(xiàn)在列表中mlist/mnolist.mlist/?.mnolist打開/關(guān)閉宏擴(kuò)展和循環(huán)塊的列表sslist/ssnolist.sslist/?.ssnolist允許/禁止替換符號擴(kuò)展列表tab.tabsize定義制表鍵tab的大小option.option{B|L|M|R|T|W|X}控制列表文件中的某些屬性表中,.option操作數(shù)所代表的含義如下:
B:把.byte偽指令的列表限制在一行里。
L:把.long偽指令的列表限制在一行里。
M:關(guān)掉列表中的宏擴(kuò)展。
R:復(fù)位B、M、T和W選項。
T:把.string偽指令的列表限制在一行里。
W:把.word偽指令的列表限制在一行里。
X:產(chǎn)生一個符號交叉參照列表。5.文件引用偽指令文件引用偽指令如表4-6所示。表4-6文件引用偽指令偽指令句法作用copy.copy[“]filename[“]從其他文件讀源文件,所讀語句出現(xiàn)在列表中include.include[“]filename[“]從其他文件讀源文件,所讀語句不出現(xiàn)在列表中def.defsymbol1[,…,symboln]確認(rèn)在當(dāng)前段中定義且能被其他段使用的符號global.globalsymbol1[,…,symboln]聲明一個或多個外部符號mlib.mlib[“]filename[“]定義宏庫名ref.refsymbol1[,…,symboln]確認(rèn)在當(dāng)前段中使用且在其他段中定義的符號6.條件匯編偽指令以下分兩種情況介紹條件匯編偽指令。(1)第一種情況:.if well-definedexpression.elseifwell-definedexpression.else.endif
(2)第二種情況:.loop [well-definedexpression].break [well-definedexpression].endloop7.符號定義偽指令符號定義偽指令如表4-7所示。表4-7符號定義偽指令偽指令句法作用asg.asg[“]字符串[“],替換符號將一個字符串賦給一個替換符號endstruct.endstruct設(shè)置類似于C的結(jié)構(gòu)定義equ/set符號.equ/.set常數(shù)將值賦給符號eval.eval表達(dá)式,替換符號將表達(dá)式的值傳送到與替代符號等同的字符串中l(wèi)abel.label符號定義一個特殊符號指向當(dāng)前段中的裝入地址struct.struct設(shè)置類似于C的結(jié)構(gòu)定義tag標(biāo)號?.tag結(jié)構(gòu)名將結(jié)構(gòu)特性與一個標(biāo)號聯(lián)系起來8.其他偽指令其他偽指令如表4-8所示。表4-8其他偽指令偽指令句法作用algebraic.algebraic告訴編譯器,文件中包含了算術(shù)偽指令end.end結(jié)束程序mmregs.mmregs定義存儲器映像寄存器的符號名稱version.version決定指令所運行的處理器emsg.emsg字符串把錯誤信息發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備中mmsg.mmsg字符串把編譯時的信息發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備中wmsg.wmsg字符串把警告信息發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備中sblock.sblock[“]段名[“][,…,“段名”]指定幾段為一個模塊newblock.newblock使局部標(biāo)號復(fù)位4.1.4TMS320C54x宏命令
TMS320C54x匯編器支持宏語言。宏命令是源程序中具有獨立功能的一段程序代碼,它可以根據(jù)用戶的需要,由用戶創(chuàng)建自己的指令。宏命令一經(jīng)定義,便可在以后的程序中多次調(diào)用,從而可以簡化和縮短源程序。其功能如下:●定義自己的宏,重新定義已存在的宏;●簡化長的或復(fù)雜的匯編代碼;●訪問由歸檔器創(chuàng)建的宏庫;●處理一個宏中的字符串;●控制展開列表。1.宏定義宏命令可以在源程序的任何位置定義,但必須在宏調(diào)用之前先定義好。宏定義也可以嵌套。定義如下:宏命令名 .macro <形式參數(shù)> ; 宏體 ; .endm 2.調(diào)用宏命令定義好之后,就可以在源程序中將宏命令名作為指令來調(diào)用這個宏了。格式如下:宏命令名 <實際參數(shù)>3.宏展開當(dāng)源程序中調(diào)用宏命令時,匯編時就將宏命令展開。在宏展開時,匯編器將實際參數(shù)傳遞給形式參數(shù),再用宏定義替代宏調(diào)用語句,并對其進(jìn)行匯編。上例的宏展開如下:11 00000 1000! LD abc,A1 00001 0000! ADD def,A1 00002 0000! ADD ghi,A1 00003 8000! STLA,adr4.2TMS320C54x匯編語言程序設(shè)計的
基本方法DSP的軟件開發(fā)一般有以下幾種方式:(1)直接編寫匯編語言源程序;(2)編寫C語言程序;(3)混合編程(既有C代碼,又含匯編代碼)。4.2.1TMS320C54x匯編語言源程序的完整結(jié)構(gòu)
匯編語言源程序中,以.asm為程序的擴(kuò)展名,程序員用“段”偽指令來組織程序的結(jié)構(gòu)。程序一般由數(shù)據(jù)段、堆棧段和代碼段組成。在4.1.3節(jié)中,我們介紹了五個段定義偽指令,.data用于存放有初值的數(shù)據(jù)塊;.usect用于為堆棧保留一塊存儲空間;.text用于設(shè)置代碼段。另外,.bss用于為變量保留一塊存儲空間;.sect常用于定義中斷向量表。 程序的基本結(jié)構(gòu)有四種:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。4.2.2順序結(jié)構(gòu)程序 順序結(jié)構(gòu)是最基本、最簡單的程序結(jié)構(gòu)形式,程序中的語句或結(jié)構(gòu)被連續(xù)執(zhí)行?!纠?】試編制程序,求出下列公式中z的值。
z=(x+y)×8-w
源程序編制如下:*************************************************ex41.asmz=(x+y)*8-w*************************************************.title"ex41.asm" .mmregsSTACK .usect "STACK",10H ;開辟堆??臻g .bss x,1 ;為變量分配4個字的空間 .bss y,1 .bss w,1 .bss z,1 .def start .datatable: .word 6,7,9 .textstart: STM#0,SWWSR ;零等待狀態(tài)
STM#STACK+10H,SP ;設(shè)置堆棧指針
STM #x,AR1 ;AR1指向x RPT #2 ;從程序存儲器傳送3個值至數(shù)據(jù)存儲器
MVPD table,*AR1+ LD @x,A
ADD @y,A ;A=x+y LD A,3 ;A=(x+y)*8 SUB @w,A ;A=(x+y)*8-w STLA,@zend: B end .end4.2.3分支結(jié)構(gòu)程序 程序的分支主要是靠條件轉(zhuǎn)移指令來實現(xiàn)的。TMS320C54x具有豐富的程序控制與轉(zhuǎn)移指令(見3.2.2節(jié)),利用這些指令可以執(zhí)行分支轉(zhuǎn)移、循環(huán)控制以及子程序操作。分支轉(zhuǎn)移指令(如B、BACC、BC等)通過改寫PC,以改變程序的流向。分支結(jié)構(gòu)也稱條件結(jié)構(gòu)?!纠?】試編制程序,求一個數(shù)的絕對值,并送回原處。源程序編制如下:*************************************************ex42.asmABSofpositiveornegative************************************************* .title "ex42.asm" .mmregsSTACK.usect"STACK",10H ;開辟堆棧空間 .bss x,1 ;為變量分配一個字的空間 .def start .datatable: .word -7 .textstart: STM #0,SWWSR;零等待狀態(tài)
STM #STACK+10H,SP;設(shè)置堆棧指針
STM #x,AR1 MVPDtable,*AR1 LD *AR1,A BC end,AGT ;若A>0,則轉(zhuǎn)至end,否則往下執(zhí)行
ABS A STL A,@xend: Bend .end4.2.4循環(huán)結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)程序設(shè)計主要用于某些需要重復(fù)進(jìn)行的操作,它簡化程序,節(jié)約內(nèi)存。循環(huán)結(jié)構(gòu)程序的設(shè)計可分為設(shè)置循環(huán)初始狀態(tài)、循環(huán)體和循環(huán)控制條件三部分。循環(huán)初始狀態(tài)主要是指設(shè)置循環(huán)次數(shù)的計數(shù)初值,以及其他為能使循環(huán)體正常工作而設(shè)置的初始狀態(tài)等(比如緩沖區(qū)首地址)。循環(huán)體是循環(huán)操作(重復(fù)執(zhí)行)部分,包括循環(huán)的工作部分及修改部分。循環(huán)的工作部分是實現(xiàn)程序功能的主要程序段;循環(huán)的修改部分是指當(dāng)程序循環(huán)執(zhí)行時,對一些參數(shù)(如地址、變量)的有規(guī)律的修正。循環(huán)控制部分是循環(huán)程序設(shè)計的關(guān)鍵。每個循環(huán)程序必須選擇一個控制循環(huán)程序運行和結(jié)束的條件。使用循環(huán)指令BANZ(當(dāng)輔助寄存器不為0時轉(zhuǎn)移)執(zhí)行循環(huán)計數(shù)和操作是十分方便的?!纠?】試編制程序,在4項乘積aixi(i=1,2,3,4)中找出最大值,并存放在累加器A中。源程序編制如下: .title "ex43.asm" .mmregs
STACK.usect "STACK",10H.bssa,4.bssx,4 .defstart .datatable: .word 1,2,3,4 .word 8,6,9,7 .textstart: STM #0,SWWSR STM #STACK+10H,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ STM #a,AR1 STM #x,AR2 STM #2,AR3 LD *AR1+,T MPY *AR2+,A ;第一個乘積在累加器A中l(wèi)oop1:LD *AR1+,T MPY*AR2+,B ;其他乘積在累加器B中
MAXA ;累加器A和B比較,選大的存在A中
BANZloop1,*AR3-
;此循環(huán)中共進(jìn)行3次乘法和比較end: Bend .end4.2.5子程序結(jié)構(gòu)子程序是一個獨立的程序段,具有確定的功能,可被其他程序調(diào)用,調(diào)用它的程序一般為主程序。子程序調(diào)用指令(如:CALL、CALA、CC等)將一個返回地址壓入堆棧,執(zhí)行返回指令(如RET、RC等)時復(fù)原。子程序的定義和調(diào)用的格式為 子程序名:
RET子程序名【例4】試編制程序,求。這是一個典型的乘法累加運算,在數(shù)字信號處理中用得很多。源程序編制如下:*************************************************ex44.asmy=a1*x1+a2*x2+a3*x3+a4*x4************************************************* .title"EX44.asm" .mmregsSTACK.usect "STACK",10H;開辟堆棧空間 .bss x,4
;為變量分配9個字的空間 .bss a,4 .bss y,1 .def start .datatable: .word 1*32768/10 .word 2*32768/10 .word-3*32768/10 .word4*32768/10 .word8*32768/10 .word6*32768/10 .word-4*32768/10 .word-2*32768/10 .textstart: STM#0,SWWSR ;零等待狀態(tài)
SSBXFRCT STM#STACK+10H,SP ;設(shè)置堆棧指針
STM#x,AR1 ;AR1指向a RPT #7 ;從程序存儲器傳送8個值主數(shù)據(jù)存儲器
MVPDtable,*AR1+ CALLSUM ;調(diào)用SUM子程序end: B endSUM:STM#x,AR2;子程序?qū)崿F(xiàn)乘累加
STM#a,AR3 RPTZA,#3 MAC*AR2+,*AR3+,A STH A,@y RET .end【例5】編寫浮點乘法程序,完成x1×x2=0.3×(-0.8)運算。雖然TMS320C54x是定點DSP,但它可通過以下3條指令支持浮點運算:
EXP AST T,EXPONENTNORM A假設(shè)定點數(shù)放在A中,這樣就可以將定點數(shù)轉(zhuǎn)換為浮點數(shù)了。反之,若將浮點數(shù)轉(zhuǎn)換為定點數(shù),只要將指數(shù)取反即可。浮點數(shù)由尾數(shù)與指數(shù)兩部分組成,其與定點數(shù)的關(guān)系如下:定點數(shù)=尾數(shù)×2-(指數(shù))指數(shù)與尾數(shù)均用補(bǔ)碼表示。例如,本例中x1的定點數(shù)0x3333(0.4)用浮點數(shù)表示時,尾數(shù)為0x6666(0.8),指數(shù)為1,即0.8×2-1=0.4;x2的定點數(shù)0xb334(-0.6)用浮點數(shù)表示為-0.6=-0.6×2-0。程序中所用的數(shù)據(jù)變量如下:x1:定點被乘數(shù);e1:被乘數(shù)的指數(shù);m1:被乘數(shù)的尾數(shù) ;x2:定點乘數(shù);e2:乘數(shù)的指數(shù) ;m2:乘數(shù)的尾數(shù) ;ep:乘積的指數(shù) ;mp:乘積的尾數(shù) ;product:定點乘積 ;temp:暫存單元。首先將定點數(shù)x1、x2轉(zhuǎn)換為浮點數(shù),浮點數(shù)相乘即指數(shù)相加,尾數(shù)相乘,最后再將乘積(浮點數(shù))轉(zhuǎn)換為定點數(shù)。*************************************************ex45.asmx1*x2=0.4*(-0.6)************************************************* .title "EX45.asm" .mmregsSTACK.usect "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 .datatable: .word4*32768/10 .word-6*32768/10 .textstart: STM #0,SWWSR STM #STACK+10H,SP ;設(shè)置堆棧指針
MVPDtable,@x1 ;將x1、x2傳送至數(shù)據(jù)存儲器
MVPDtable+1,@x2
LD @x1,16,A ;先將x1加載至A(31~16位),因小數(shù)在高位
EXP A ;提取指數(shù)
ST T,@e1 ;保存x1的指數(shù)
NORM A ;將x1規(guī)格化為浮點數(shù),按指數(shù)將尾數(shù)移位
STH A,@m1 ;保存x1的尾數(shù)
LD @x2,16,A EXP A ST T,@e2 ;保存x2的指數(shù)
NORMA STH A,@m2 ;保存x2的尾數(shù)
CALLMULT ;調(diào)用浮點乘法子程序done: BdoneMULT:SSBXFRCT ;小數(shù)相乘消去冗余符號位
SSBXSXM ;符號位擴(kuò)展
LD @e1,A :指數(shù)相加
ADD@e2,A STL A,@ep
LD@m1,T
;尾數(shù)相乘(有符號數(shù)),乘積左移1位
MPY@m2,A EXP A ;對尾數(shù)乘積規(guī)格化
ST T,@temp NORMA STH A,@mp ;保存乘積尾數(shù)
LD @temp,A ;修正乘積指數(shù),ep+temp=ep
ADD @ep,A STL A,@ep ;保存乘積指數(shù)
NEG A;乘積指數(shù)反號,將浮點乘積轉(zhuǎn)換為定點數(shù)
STL A,@temp LD @temp,T LD @mp,16,A NORMA STH A,@product ;保存定點乘積
RET .end程序執(zhí)行結(jié)果如下:x13333Hx2B334He10001Hm16666He20000Hm2B334Hep0002Hmp8520HproductE148HtempFFFEH4.3TMS320C54x匯編語言程序的編輯、匯編與鏈接過程匯編語言源程序編好以后,必須經(jīng)過匯編和鏈接才能運行。圖4-1給出了對匯編語言源程序的編輯、匯編和鏈接過程。簡述過程如下。圖4-1匯編語言源程序的編輯、匯編和鏈接過程1.編輯程序代碼的編寫可以在任何一種文本編輯器中進(jìn)行,如EDIT、記事本、WORD等,生成.asm文件。2.匯編利用TMS320C54x的匯編器ASM500對已經(jīng)編好的一個或者多個源文件分別進(jìn)行匯編,并生成.lst(列表)文件和.obj(目標(biāo))文件。常用的匯編命令為
asm500%1-s-l-x其中:%l:用源文件名代入。-s:將所有定義的符號放在目標(biāo)文件的符號表中。-l:產(chǎn)生一個列表文件。-x:產(chǎn)生一個交叉匯編表,并把它附加到列表文件的最后。此外,asm500還可以加入一些選項,以下將逐一說明。-a:生成絕對列表文件。匯編器不產(chǎn)生目標(biāo)文件(.obj)。-c:使匯編語言文件中大小寫沒有區(qū)別。-d:為名字符號設(shè)置初值,這和.set等效。如:asm500-dname=111將使程序中的name設(shè)置值為111,默認(rèn)賦值為1。-hc:將選定的文件復(fù)制到匯編模塊。格式為-hcfilename所選定的文件被插入到源文件語句的前面,復(fù)制的文件將出現(xiàn)在匯編列表文件中。-hi:將選定的文件包含到匯編模塊。格式為-hifilename所選定的文件包含到源文件語句的前面,所包含的文件不出現(xiàn)在匯編列表文件中。-i:規(guī)定一個目錄,匯編器可以在這個目錄下找到.copy、.include和.mlib命令所命名的文件。格式為-ipathname時最多可規(guī)定10個目錄,每條路徑名的前面必須加上-i選項。-mg:源文件,包含有代數(shù)指令。-q:quiet靜處理,匯編器不產(chǎn)生任何程序的信息。3.鏈接利用TMS320C54x的鏈接器LNK500,根據(jù)鏈接器命令文件(.cmd)對已經(jīng)匯編過的一個或是多個目標(biāo)文件(.obj)進(jìn)行鏈接,生成.map文件和.out文件。常用的鏈接器命令為
lnk5001%.cmd
其中,1%為程序名。命令文件(.cmd)是對存儲器進(jìn)行配置的文件,該文件如何生成將在后面詳細(xì)介紹。(1)鍵入命令。其格式如下:
lnk500file1.objfile2.obj-olink.out
上述鏈接器命令是鏈接file1和file2的兩個目標(biāo)文件,生成一個名為link.out的執(zhí)行輸出文件。選項-olink.out缺省時,將生成一個名為a.out的輸出文件。
鍵入命令lnk500,鏈接器將給予如下提示:Commandfiles:Objectfiles[.obj]:Outputfile[a.out]:Options:其中:
Commandfiles(命令文件):要求鍵入一個或多個命令文件。
Objectfiles(目標(biāo)文件):要求鍵入一個或多個需要鏈接的目標(biāo)文件名。缺省擴(kuò)展名為.obj,文件名之間要用空格或逗號分開。
Outputfile(輸出文件):要求鍵入一個輸出文件名,也就是鏈接器生成的輸出模塊名。如果此項缺省,鏈接器將生成一個名為a.out的輸出文件。
Options(選項):提示附加的選項,選項前應(yīng)加一短橫線,也可以在命令文件中安排鏈接選項。-mfilename:生成一個filename.map映像文件。.map文件中列出了輸入/輸出段布局,以及外部符號重定位之后的地址等。 -ofilename:指定可執(zhí)行輸出模塊的文件名。如果缺省,則此文件名為a.out。-a:生成一個絕對地址的可執(zhí)行輸出模塊。所建立的絕對地址輸出文件中不包含重新定位信息。如果未指定-a或-r,默認(rèn)為-a。-ar:生成地址可重新定位的可執(zhí)行目標(biāo)模塊。-eglobal_symbol:定義一個全局符號,表明程序從這個標(biāo)號開始運行。-ffill_value:對輸出模塊各段之間的空單元設(shè)置一個16位常數(shù)值(fill_value)。-r:生成一個可重新定位的輸出模塊。-stack:設(shè)置堆棧大小,默認(rèn)值為1K。-Ipathname:鏈接器在此路徑下搜索需要的文件。-lfilename:必須出現(xiàn)在-I之后。filename一般為存檔文件。-vn:指定輸出文件的COFF格式。默認(rèn)格式是COFF2。4.4匯編器匯編器(Assembler)將匯編語言源文件匯編成機(jī)器語言COFF的目標(biāo)文件。源文件中包括指令、匯編指令以及宏指令。匯編器的功能如下:●將匯編語言源程序匯編成一個可重新定位的目標(biāo)文件(.obj文件)?!窀鶕?jù)需要,可以生成一個列表文件(.lst文件)?!窀鶕?jù)需要,可以在列表文件后面附加一張交叉引用表?!駥⒊绦虼a分成若干段,為每個目標(biāo)代碼段設(shè)置一個SPC(段程序計數(shù)器)?!穸x和引用全局符號?!駞R編條件程序塊。●支持宏功能,允許定義宏命令。4.4.1COFF文件的一般概念匯編器建立的目標(biāo)文件格式稱為公共目標(biāo)文件格式COFF(CommonObjectFileFormat)。
由于COFF在編寫一個匯編語言程序時采用代碼段和數(shù)據(jù)段的形式,因此COFF會使模塊化編程和管理變得更加方便。匯編器和鏈接器都有建立并管理段的一些偽指令。
COFF文件有三種形式:COFF0、COFF1和COFF2。每種形式的COFF文件都有不同的頭文件,而其數(shù)據(jù)部分是相同的。TMS320C54x匯編器和C編譯器建立的是COFF2文件。鏈接器能夠讀/寫所有形式的COFF文件,默認(rèn)生成的是COFF2文件。用鏈接器-vn選項可以選擇不同形式的COFF文件。所謂段(Section),是指連續(xù)地占有存儲空間的一個代碼塊或數(shù)據(jù)塊,是COFF文件中最重要的概念。一個目標(biāo)文件中的每一個段都是分開的和各不相同的。所有的COFF目標(biāo)文件都包含以下三種形式的段:.text 文本段.data
數(shù)據(jù)段.bss
保留空間段圖4-2目標(biāo)文件中的段與目標(biāo)存儲器之間的關(guān)系4.4.2匯編器對段的處理匯編器靠五條命令(.bss、.usect、.text、.data和.sect)識別匯編語言程序的各個部分。如果匯編語言程序中一個段命令都沒用,那么匯編器把程序中的內(nèi)容都匯編到.text段。匯編器第一次遇到新段時,將該段的段程序計數(shù)器(SPC)置為0,并將隨后的程序代碼或數(shù)據(jù)順序編譯進(jìn)該段中。匯編器遇到同名段時,將它們合并,然后將隨后的程序代碼或數(shù)據(jù)順序編譯進(jìn)該段中。當(dāng)匯編器遇到.text、.data和.sect偽指令時,匯編器停止將隨后的程序代碼或數(shù)據(jù)順序編譯進(jìn)當(dāng)前段中,而是順序編譯進(jìn)入遇到的段中。當(dāng)匯編器遇到.bss和.usect偽指令時,匯編器并不結(jié)束當(dāng)前段,而只是簡單地暫時脫離當(dāng)前段,隨后的程序代碼或數(shù)據(jù)仍將順序編譯進(jìn)當(dāng)前段中。.bss和.usect偽指令可以出現(xiàn)在.text、.data和.sect段中的任何位置,它們不會影響這些段的內(nèi)容。匯編器為每個段都安排了一個單獨的段程序計數(shù)器(SPC)。SPC表示一個程序代碼或數(shù)據(jù)段內(nèi)的當(dāng)前地址。最初,匯編器將每個SPC置為0。當(dāng)代碼或數(shù)據(jù)被加到一個段內(nèi)時,相應(yīng)的SPC的值就增加。如果繼續(xù)匯編進(jìn)一個段,則匯編器記住前面的SPC值,并在該點繼續(xù)增加SPC的值。鏈接器在鏈接時要對每個段進(jìn)行重新定位。匯編程序?qū)υ闯绦騾R編時,如果采用-l(小寫的L)選項,則匯編后將生成一個列表文件。下面給出了一個列表文件的例子,用來說明在匯編過程中段偽指令在不同的段之間來回交換,逐步建立COFF段的過程和SPC的修改過程。列表文件中每行由四個區(qū)域組成,即Field1:源程序的行號。Field2:段程序計數(shù)器SPC。Field3:目標(biāo)代碼。Field4:源程序。【例6】段定義偽指令應(yīng)用舉例。2*****************************************3**Assembleaninitializedtableinto.data.**4**********************************************50000.data600000011 coeff.word011H,022H,033H00010022000200337******************************************8**Reservespacein.bssforavariable.**9******************************************100000.bssbuffer,1011********************************************12**Stillin.data.**13********************************************1400030123 ptr .word0123H15********************************************16**Assemblecodeintothe.textsection.**17********************************************180000.text190000100F add: LD 0FH,A200001F010 aloop:SUB#1,A00020001210003F842BC aloop,AGEQ00040001'22********************************************23**Anotherinitializedtableinto.data.**24********************************************250004.data26000400aaivals.word0AAH,0BBB,0CCH000500bb000600cc27*******************************************28**Defineanothersectionformorevariables.**29*******************************************300000 var2. usect "newvars",1310001 inbuf .usect "newvars",732********************************************33**Assemblemorecodeinto.text.**34********************************************350005.text360005ll0a mpy: LD0AH,B370006f166mloop:MPY#0AH,B0007000a380008f868BC
mloop,BNOV00090006'39******************************************40**Defineanamedsectionforint.vectors.**41******************************************420000.sect "vectors"4300000011.word 011H,033H4400010033
此例共生成五個段:①.text:包含10個字的目標(biāo)代碼。②.data:包含7個字的數(shù)據(jù)。③vectors:由.sect偽指令產(chǎn)生的自定義段,包含2個字的初始化數(shù)據(jù)。④.bss:為變量保留10個字的存儲空間。⑤newvars:由.usect偽指令產(chǎn)生的自定義段,為變量保留8個字的存儲空間。本例的目標(biāo)代碼如圖4-3所示。圖4-3目標(biāo)代碼4.5鏈接器鏈接器的功能如下:●將各個段配置到目標(biāo)系統(tǒng)的存儲器中?!駥Ω鱾€符號和段進(jìn)行重新定位,并給它們指定一個最終的地址。●解決輸入文件之間未定義的外部引用問題。鏈接器的主要功能就是對程序定位,它采用的是一種相對的程序定位方式。程序的定位方式有三種:編譯時定位、鏈接時定位和加載時定位。4.5.1鏈接器對段的處理鏈接器對段的處理具有兩個功能。其一,將輸入段組合生成輸出段,即將多個.obj文件中的同名段合并成一個輸出段;也可將不同名的段合并產(chǎn)生一個輸出段。其二,將輸出段定位到實際的存儲空間中。鏈接器提供MEMORY和SECTIONS兩個命令來完成上述功能。MEMORY命令用于描述系統(tǒng)實際的硬件資源;SECTIONS命令用于描述段如何定位到恰當(dāng)?shù)挠布Y源上。鏈接器通過命令文件(.cmd)來獲得上述信息。1.缺省的存儲器分配圖4-4說明了兩個文件的鏈接過程。圖4-4鏈接器將輸入段組合成一個可執(zhí)行的目標(biāo)模塊2.將段放入存儲器空間如果有時希望采用其他的結(jié)合方法,例如,不希望將所有的.text段合并到一個.text段,或者希望將自定義段放在.data的前面,又或者想將代碼與數(shù)據(jù)分別存放到不同的存儲器(RAM、ROM、EPROM等)中,此時就需要定義一個.cmd文件,采用MEMORY和SECTIONS命令,告訴鏈接器如何安排這些段。下面將詳細(xì)介紹鏈接器命令文件的構(gòu)成。4.5.2鏈接器命令文件 鏈接命令文件含有鏈接時所需要的信息。命令文件.cmd由三部分組成:輸入/輸出定義、MEMORY命令和SECTIONS命令。輸入/輸出定義這部分包括輸入文件名(目標(biāo)文件.obj、庫文件.lib和交叉索引文件.map)、輸出文件.out和鏈接器選項?!纠?】鏈接ex41.cmd文件。ex41.obj /*輸入文件*/-oex41.out /*鏈接器選項*/-mex41.map /*鏈接器選項*/-estart /*鏈接器選項*/MEMORY{PAGE0:EPROM:org=0E000H,len=100H
PAGE1:SPRAM:org=0060H,len=20HDARAM:org=0080H,len=100H}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}圖4-5存儲器配置圖1.MEMORY命令
MEMORY命令可用來定義用戶設(shè)計的系統(tǒng)中所包含的各種形式的存儲器,以及它們占據(jù)的地址范圍。MEMORY偽指令的句法格式如下:
MEMORY{PAGE0:name1[(attr)]:orign=constant,length=constant;PAGE1:namen[(attr)]:orign=constant,length=constant;}
在鏈接器命令文件中,MEMORY用大寫字母,緊隨其后的是用大括號括起來的一個定義存儲器范圍的清單。其中:
PAGE:存儲空間標(biāo)記,最多可規(guī)定255頁。
name:定義存儲器區(qū)間名字。
attr:定義已命名地址空間的屬性。
origin:指定存儲區(qū)的起始位置,可縮寫成org或o。length:指定存儲區(qū)的長度,可縮寫成len或l。fill:填充值,為沒有定位輸出段的存儲器單元填充一個數(shù),可縮寫成f。2.SECTIONS命令
SECTIONS命令可將輸出段定位到所定義的存儲器中。具體任務(wù)如下:說明如何將輸入段組合成輸出段;在可執(zhí)行程序中定義輸出段;規(guī)定輸出段在存儲器中的存放位置;允許重新命名輸出段。SECTIONS命令的一般語法如下:SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}3.MEMORY和SECTIONS命令的缺省算法如果沒有利用MEMORY和SECTIONS命令,鏈接器就按缺省算法來定位輸出段。具體算法如下:
MEMORY{PAGE0:PROG:origin=0x0080,length=0xFF00PAGE1:DATA:origin=0x0080,length=0xFF80}SECTIONS{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0;cflagoptiononly.bss:PAGE=1}【例8】鏈接ex42.cmd文件。ex42.obj-oex42.out-mex42.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}【例9】鏈接ex43.cmd文件。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:>DARAM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能水電安裝與維護(hù)一體化承包合同范文4篇
- 二零二五年度智慧城市建設(shè)項目管理合同3篇
- 2025年度苗木種植基地水資源管理與利用合同3篇
- 2025年度牛只運輸與市場行情分析服務(wù)合同4篇
- 2025版模具制造設(shè)備共享租賃合同4篇
- 二零二五年度城市綠化工程泥漿外運與生態(tài)修復(fù)合同4篇
- 二零二五年度農(nóng)機(jī)二手交易合同協(xié)議4篇
- 2025年度車床租賃及加工成本控制服務(wù)合同4篇
- 二零二五版旅游服務(wù)門店承包經(jīng)營合同4篇
- 2025年度民辦學(xué)校教師退休養(yǎng)老保障聘用合同4篇
- 垃圾處理廠工程施工組織設(shè)計
- 天皰瘡患者護(hù)理
- 2025年蛇年新年金蛇賀歲金蛇狂舞春添彩玉樹臨風(fēng)福滿門模板
- 《建筑制圖及陰影透視(第2版)》課件 4-直線的投影
- 2024-2030年中國IVD(體外診斷)測試行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 損失補(bǔ)償申請書范文
- 壓力與浮力的原理解析
- 鐵路損傷圖譜PDF
- 裝修家庭風(fēng)水學(xué)入門基礎(chǔ)
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)二 社群的種類與維護(hù)
- 《詩詞寫作常識 詩詞中國普及讀物 》讀書筆記思維導(dǎo)圖
評論
0/150
提交評論