第4章-TMS320C54x匯編語言程序設計課件_第1頁
第4章-TMS320C54x匯編語言程序設計課件_第2頁
第4章-TMS320C54x匯編語言程序設計課件_第3頁
第4章-TMS320C54x匯編語言程序設計課件_第4頁
第4章-TMS320C54x匯編語言程序設計課件_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章TMS320C54x匯編語言程序設計4.1TMS320C54x匯編語言的基本概念

4.2TMS320C54x匯編語言程序設計的基本方法4.3TMS320C54x匯編語言程序的編輯、匯編與鏈接過程4.4匯編器

4.5鏈接器4.6Simulator的使用方法4.7匯編程序舉例4.1TMS320C54x匯編語言的基本概念4.1.1TMS320C54x匯編語句的組成匯編語言源程序中的每一行語句都可以由四部分組成,句法格式如下:[標號][:]助記符[操作數(shù)][;注釋]其中,[]為選項書寫規(guī)則如下:

(1)所有語句必須以標號、空格、星號(*)或分號開始。

(2)所有包含偽指令的語句必須在一行內完全指定。

(3)若使用標號,則標號必須從第一列開始。

(4)語句的每部分必須用一個或多個空格分開,Tab鍵與空格等效。

1.標號所有指令或大多數(shù)偽指令前面都可帶有語句標號,供本程序的其他部分或其他程序調用。標號是任選項,標號后可以加也可以不加冒號(:)。標號必須從第一列開始,其最多可長達32個字符(A~Z,a~z,0~9,_和$),但第一個字符不能是數(shù)字。引用標號時,標號的大小寫必須一致,標號的值就是段程序計數(shù)器(SPC)的當前值。若不用標號,則第一個字母必須為空格、分號或星號(*)。

2.助記符助記符跟在標號的后面。助記符不能從第一列開始。助記符包含指令、偽指令、宏命令和宏調用。作為指令,一般用大寫;偽指令和宏命令則以句號(.)開始,且為小寫。偽指令可以形成常數(shù)和變量,當用它控制匯編和鏈接過程時,可以不占存儲空間。

3.操作數(shù)操作數(shù)是指指令中的操作數(shù)或偽指令中定義的內容。操作數(shù)之間必須用逗號(,)分開。有的指令無操作數(shù),如指令NOP。指令中的操作數(shù)可以是寄存器、地址、常數(shù)、算術或邏輯表達式。

4.注釋注釋從分號(;)開始,可以放在指令或偽指令的后面,也可以單獨占一行或數(shù)行。注釋是任選項。如果注釋從第1列開始,也可以用星號(*)。

4.1.2TMS320C54x匯編語言中的常數(shù)、字符串、符號與表達式

1.常數(shù)和字符串常數(shù)就是指令中出現(xiàn)的那些固定值。匯編器支持7種類型的常數(shù):二進制數(shù)、十進制數(shù)、八進制數(shù)、十六進制數(shù)、字符常數(shù)、字符串和浮點常數(shù)。①二進制數(shù):二進制數(shù)字(0或1),其后綴為B(或b)。②十進制數(shù):用數(shù)字0~9表示,無后綴。③八進制數(shù):用數(shù)字0~7表示,其后綴為Q或q。④十六進制數(shù):用數(shù)字0~9及字母A~F表示,其后綴為h或H。⑤字符常數(shù):是由單引號(‘’)括起來的1或2個字符組成的字符串,每個字符在內部表示為8位ASCII碼。⑥字符串:是由雙引號(“”)括起來的一串字符。⑦浮點常數(shù):是一串十進制數(shù),可帶小數(shù)點、分數(shù)和指數(shù)部分。

2.符號符號用作標號、常數(shù)和替代符號。符號名可以是長達200個字符的字母(A~Z,a~z)、數(shù)字(0~9)加上$或下劃線(_)。第一個字符不能是數(shù)字,符號中間不能有空格。符號分大小寫,例如:Abc。

3.表達式

1)運算順序影響表達式運算順序的三個主要因素是:圓括號、優(yōu)先級和同級運算順序。圓括號內的表達式最先運算,不能用{}或[]來代替()。

TMS320C54x匯編器的優(yōu)先級使用與C語言類似,優(yōu)先級高的運算先執(zhí)行。

2)表達式溢出在匯編的過程中執(zhí)行算術運算后,匯編器將檢查溢出狀態(tài)。一旦出現(xiàn)上溢和下溢,它都發(fā)出值被截斷了的警告信息,但在做乘法時,匯編器不檢查溢出狀態(tài)。

3)條件表達式匯編器在任何表達式中都支持關系操作,這對條件匯編特別有用。關系運算符如下:

=(等于)==(等于) !=(不等于) >=(大于等于)<=(小于等于)>(大于)<(小于)

4.1.3TMS320C54x偽指令

TMS320C54x偽指令給程序提供數(shù)據(jù)、控制匯編過程。具體實現(xiàn)以下任務:

(1)將數(shù)據(jù)和代碼匯編到特定的段。

(2)為未初始化的變量保留存儲空間。

(3)控制展開列表的形式。

(4)存儲器初始化。

(5)匯編條件塊。

(6)定義全局變量。

(7)指定匯編器可以獲得宏的特定庫。

(8)檢查符號調試信息。常用的偽指令如表4-3所示。表4-3常用偽指令偽指令句法作用title.title“string”標題名。例如:.title“example.asm”end.end結束偽指令,放在匯編語言源程序的最后text.text[段起點]包含可執(zhí)行程序代碼data.data[段起點]包含初始化數(shù)據(jù)value1[,…,valuen]設置16位無符號整型量word.wordvalue1[,…,valuen]設置16位帶符號整型量偽指令句法作用bss.bss符號,字數(shù)為未初始化的變量保留存儲空間sect.sect“段名”[,段起點]建立包含代碼和數(shù)據(jù)的自定義段usect符號.usect“段名”,字數(shù)為未初始化的變量保留存儲空間的自定義段def.def變量1[,…,變量n]在當前模塊中定義,并可在別的模塊中使用ref.ref變量1[,…,變量n]在當前模塊中使用,但在別的模塊中定義偽指令句法作用global.global變量1[,…,變量n]可替代?.def和?.ref偽指令mmregs.mmregs定義存儲器映像寄存器的替代符號

1.段定義偽指令 段定義偽指令有以下五個: ●.bss(未初始化段)●.data(已初始化段) ●.sect(已初始化段)●.text(已初始化段) ●.usect(未初始化段)

1)未初始化段

.bss和.usect命令建立未初始化段。未初始化段就是TMS320C54x存儲器中的保留空間,它通常被定位在RAM區(qū)。在目標文件中,這些段中沒有確切內容,在程序運行時,可以利用這些存儲空間存放變量,變量一般存放于數(shù)據(jù)存儲器區(qū)域中。這兩條命令的句法如下:

.bss符號,字數(shù)符號.usect“段名”,字數(shù)

2)已初始化段

.text、.data和.sect命令建立已初始化段。已初始化段包括可執(zhí)行代碼或已初始化的數(shù)據(jù)。在目標文件中,這些段中都有確切內容,當加載程序時再將這些內容放到TMS320C54x的存儲器中。每個初始化段都可以重新定位,也可以引用在其他段中定義的符號,鏈接器會自動處理段間的相互引用。這三條命令的句法如下:

.text[段起點].data[段起點].sect"段名”[,段起點]

.text后是匯編語言程序的正文。經匯編后,.text后的是可執(zhí)行程序代碼,一般存放于程序存儲器區(qū)域中。

.data后是已初始化數(shù)據(jù),有int和word兩種數(shù)據(jù)形式。由命令文件可以將定義的數(shù)據(jù)存放于程序或數(shù)據(jù)存儲器中。

.sect建立包含代碼和數(shù)據(jù)的自定義段,常用于定義中斷向量表。

2.常數(shù)初始化偽指令常數(shù)初始化偽指令如表4.3.3所示。

4.1.4TMS320C54x宏命令

TMS320C54x匯編器支持宏語言。宏命令是源程序中具有獨立功能的一段程序代碼,它可以根據(jù)用戶的需要,由用戶創(chuàng)建自己的指令。宏命令一經定義,便可在以后的程序中多次調用,從而可以簡化和縮短源程序。

1.宏定義宏命令可以在源程序的任何位置定義,但必須在宏調用之前先定義好。宏定義也可以嵌套。定義如下:宏命令名

.macro <形式參數(shù)>

; 宏體 ;

.endm

2.調用宏命令定義好之后,就可以在源程序中將宏命令名作為指令來調用這個宏了。格式如下:宏命令名 <實際參數(shù)>

3.宏展開當源程序中調用宏命令時,匯編時就將宏命令展開。在宏展開時,匯編器將實際參數(shù)傳遞給形式參數(shù),再用宏定義替代宏調用語句,并對其進行匯編。上例的宏展開如下:

11 00000 1000! LD abc,A1 00001 0000! ADD def,A1 00002 0000! ADD ghi,A1 00003 8000! STLA,adr4.2TMS320C54x匯編語言程序設計的

基本方法DSP的軟件開發(fā)一般有以下幾種方式:(1)直接編寫匯編語言源程序;(2)編寫C語言程序;(3)混合編程(既有C代碼,又含匯編代碼)。

4.2.1TMS320C54x匯編語言源程序的完整結構

匯編語言源程序中,以.asm為程序的擴展名,程序員用“段”偽指令來組織程序的結構。程序一般由數(shù)據(jù)段、堆棧段和代碼段組成。在前面我們介紹了五個段定義偽指令,.data用于存放有初值的數(shù)據(jù)塊;.usect用于為堆棧保留一塊存儲空間;.text用于設置代碼段。另外,.bss用于為變量保留一塊存儲空間;.sect常用于定義中斷向量表。 程序的基本結構有四種:順序結構、分支結構、循環(huán)結構和子程序結構。

4.2.2順序結構程序 順序結構是最基本、最簡單的程序結構形式,程序中的語句或結構被連續(xù)執(zhí)行。

【例1】試編制程序,求出下列公式中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 ;設置堆棧指針

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 .end

4.2.3分支結構程序 程序的分支主要是靠條件轉移指令來實現(xiàn)的。TMS320C54x具有豐富的程序控制與轉移指令,利用這些指令可以執(zhí)行分支轉移、循環(huán)控制以及子程序操作。分支轉移指令(如B、BACC、BC等)通過改寫PC,以改變程序的流向。分支結構也稱條件結構?!纠?】試編制程序,求一個數(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;設置堆棧指針

STM #x,AR1 MVPDtable,*AR1 LD *AR1,A BC end,AGET ;若A>0,則轉至end,否則往下執(zhí)行

ABS A STL A,@xend: Bend .end

4.2.4循環(huán)結構程序循環(huán)結構程序設計主要用于某些需要重復進行的操作,它簡化程序,節(jié)約內存。循環(huán)結構程序的設計可分為設置循環(huán)初始狀態(tài)、循環(huán)體和循環(huán)控制條件三部分。循環(huán)初始狀態(tài)主要是指設置循環(huán)次數(shù)的計數(shù)初值,以及其他為能使循環(huán)體正常工作而設置的初始狀態(tài)等(比如緩沖區(qū)首地址)。循環(huán)體是循環(huán)操作(重復執(zhí)行)部分,包括循環(huán)的工作部分及修改部分。循環(huán)的工作部分是實現(xiàn)程序功能的主要程序段;循環(huán)的修改部分是指當程序循環(huán)執(zhí)行時,對一些參數(shù)(如地址、變量)的有規(guī)律的修正。循環(huán)控制部分是循環(huán)程序設計的關鍵。每個循環(huán)程序必須選擇一個控制循環(huán)程序運行和結束的條件。使用循環(huán)指令BANZ(當輔助寄存器不為0時轉移)執(zhí)行循環(huán)計數(shù)和操作是十分方便的。

【例3】試編制程序,在4項乘積aixi(i=1,2,3,4)中找出最大值,并存放在累加器A中。源程序編制如下:

.title "ex43.asm" .mmregsSTACK.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)中共進行3次乘法和比較end: Bend .end

4.2.5子程序結構子程序是一個獨立的程序段,具有確定的功能,可被其他程序調用,調用它的程序一般為主程序。子程序調用指令(如:CALL、CALA、CC等)將一個返回地址壓入堆棧,執(zhí)行返回指令(如RET、RC等)時復原。子程序的定義和調用的格式為 子程序名:

RET子程序名

【例5】編寫浮點乘法程序,完成x1×x2=0.3×(-0.8)運算。雖然TMS320C54x是定點DSP,但它可通過以下3條指令支持浮點運算:

EXP AST T,EXPONENTNORM A假設定點數(shù)放在A中,這樣就可以將定點數(shù)轉換為浮點數(shù)了。反之,若將浮點數(shù)轉換為定點數(shù),只要將指數(shù)取反即可。浮點數(shù)由尾數(shù)與指數(shù)兩部分組成,其與定點數(shù)的關系如下:定點數(shù)=尾數(shù)×2-(指數(shù))

指數(shù)與尾數(shù)均用補碼表示。例如,本例中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轉換為浮點數(shù),浮點數(shù)相乘即指數(shù)相加,尾數(shù)相乘,最后再將乘積(浮點數(shù))轉換為定點數(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 ;設置堆棧指針

MVPDtable,@x1

;將x1、x2傳送至數(shù)據(jù)存儲器

MVPDtable+1,@x2

LD @x1,16,A

;先將x1加載至A(31~16位),因小數(shù)在高位

EX

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論