第5章C54的匯編語言程序設(shè)計_第1頁
第5章C54的匯編語言程序設(shè)計_第2頁
第5章C54的匯編語言程序設(shè)計_第3頁
第5章C54的匯編語言程序設(shè)計_第4頁
第5章C54的匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩148頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章

TMS320C54x匯編語言程序設(shè)計內(nèi)容提要

匯編語言程序設(shè)計是應(yīng)用軟件設(shè)計的基礎(chǔ),主要任務(wù)是利用匯編指令和偽指令編寫源程序以完成指定的功能。本章將結(jié)合例子介紹TMS320C54x匯編語言源程序設(shè)計的基本方法,涉及的內(nèi)容包括:

匯編語言源程序的格式常數(shù)、字符串、符號和表達式的規(guī)定堆棧的使用方法分支、調(diào)用、返回控制程序加法、乘法、除法、長字和并行運算程序單指令、塊重復(fù)、循環(huán)嵌套等重復(fù)操作程序數(shù)據(jù)塊傳送程序小數(shù)運算程序和浮點運算程序

2023/3/91DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計

5.1概述

5.2堆棧的使用方法5.3控制程序5.4算術(shù)運算程序5.5重復(fù)操作程序5.6數(shù)據(jù)塊傳送程序5.7小數(shù)運算程序5.8浮點運算程序2023/3/92DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1概述

TMS320C54x匯編語言源程序由源語句組成。這些語句可以包含匯編語言指令、匯編偽指令和注釋。程序的編寫必須符合一定的格式,以便匯編器將源文件轉(zhuǎn)換成機器語言的目標文件。

本節(jié)將介紹匯編語言源程序的格式、各種常數(shù)、符號、字符串和表達式的規(guī)定。

2023/3/93DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1概述

匯編語言程序以.asm為擴展名,可以用任意的編輯器編寫源文件。一條語句占源程序的一行,長度可以是源文件編輯器格式允許的長度,但匯編器每行最多讀200個字符。因此,語句的執(zhí)行部分必須限制在200個字符以內(nèi)。

5.1.1

匯編語言源程序格式

2023/3/94DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計1.

源文件格式

5.1.1

匯編語言源程序格式

助記符指令源語句的每一行通常包含4個部分:標號區(qū)、助記符區(qū)、操作數(shù)區(qū)和注釋區(qū)。

[標號][:]

助記符

[操作數(shù)]

[;注釋]助記符指令語法格式:

【例5.1.1】

助記符指令源語句舉例。

NANHUA

.set

1

;符號NANHUA=1

Begin:

LD

#NANHUA,AR1

;將1加載到AR1

標號

助記符

操作數(shù)

注釋

2023/3/95DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計1.

源文件格式

語句的書寫規(guī)則:

①所有語句必須以標號、空格、星號或分號(*或;)開始;②標號是可選項,若使用標號,則標號必須從第一列開始;

③所有包含有匯編偽指令的語句必須在一行完成指定;④各部分之間必須用空格分開,Tab字符與空格等效;2023/3/96DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計1.

源文件格式

語句的書寫規(guī)則:

⑤程序中注釋是可選項。如果注釋在第一列開始時,前面必須標上星號或分號,在其他列開始的注釋前面必須以分號開頭;

⑥如果源程序很長,需要書寫若干行,可以在前一行用反斜杠字符(\)結(jié)束,余下部分接著在下一行繼續(xù)書寫。

2023/3/97DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.標號

所有匯編指令和大多數(shù)匯編偽指令都可以選用標號,供本程序或其它程序調(diào)用。①標號必須從語句的第1列寫起,其后的冒號“:”可任選;②標號為任選項,若不使用標號,則語句的第一列必須是空格、星號或分號;③標號是由字母、數(shù)字以及下劃線和美元符號等組成,最多可達32個字符;④

標號分大小寫,且第一個字符不能是數(shù)字。2023/3/98DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.標號

在使用標號時,標號的值是段程序計數(shù)器SPC的當前值。

例如,若使用.word偽指令初始化幾個字,則標號將指到第一個字。

【例5.1.2】

標號格式舉例。

9

000000

10

000040

000A

Start:

.word0Ah,3,7

000041

0003

000042

0007;假設(shè)匯編了某個其他代碼標號,值為40h2023/3/99DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.助記符

助記符用來表示指令所完成的操作,可以是匯編語言指令、匯編偽指令、宏偽指令。助記符指令:一般用大寫,不能從第一列開始;

匯編偽指令:用來為程序提供數(shù)據(jù)和控制匯編進程。以句號“.”開始,且用小寫;宏偽指令:用來定義一段程序,以便宏調(diào)用來調(diào)用這段程序。以句號“.”開始,且用小寫;

宏調(diào)用:用來調(diào)用由宏偽指令定義的程序段。2023/3/910DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.操作數(shù)操作數(shù)是指指令中參與操作的數(shù)值或匯編偽指令定義的內(nèi)容,緊跟在助記符的后面,由一個或多個空格分開。

操作數(shù)之間必須用逗號“,”分隔;

操作數(shù)可以是常數(shù)、符號或表達式;

操作數(shù)中的常數(shù)、符號或表達式可用來作為地址、立即數(shù)或間接地址;2023/3/911DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.操作數(shù)(1)

指令的操作數(shù)前綴

使用“#”符號作為操作數(shù)的前綴;

使用“*”符號作為操作數(shù)的前綴;

使用“@”符號作為操作數(shù)的前綴。

匯編器允許指定的常數(shù)、符號或表達式作為地址、立即數(shù)或間接地址。

作為操作數(shù)的前綴有三種情況:2023/3/912DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計(1)

指令的操作數(shù)前綴①用“#”作前綴

例如:

Label:ADD

#

99,B

使用“#”號作為前綴,匯編器將操作數(shù)作為立即數(shù)處理。即使操作數(shù)是寄存器或地址,也將作為立即數(shù)。

如果操作數(shù)是地址,匯編器將把地址處理為一個數(shù)值,而不使用地址的內(nèi)容。

操作數(shù)#

99是一個立即數(shù)。

2023/3/913DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計(1)

指令的操作數(shù)前綴②用“*”作前綴

例如:

Label:LD*AR3,B

使用“*”符號作為前綴,匯編器將操作數(shù)作為間接地址,即把操作數(shù)的內(nèi)容作為地址。

操作數(shù)*AR3指定一個間接地址。該指令將引導(dǎo)匯編器找到寄存器AR3的內(nèi)容作為地址,然后將該地址中的內(nèi)容裝入指定的累加器B中。2023/3/914DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計(1)

指令的操作數(shù)前綴③用“@”作前綴

例如:

Label:LD

@x,A

使用“@”符號作為前綴,匯編器將操作數(shù)作為直接地址,即操作數(shù)由直接地址碼賦值。

只要DP=0,將直接地址x中的內(nèi)容裝入指定的累加器A中。

2023/3/915DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.操作數(shù)(2)偽指令的立即數(shù)

例如:

SUB#

18,B

;操作數(shù)#18為立即數(shù)

將“#”加在數(shù)值之前而構(gòu)成的立即數(shù)方式,主要用在指令中。

通常,立即數(shù)在偽指令中用的較少,但在某些情況下,立即數(shù)也可以作為偽指令的操作數(shù)。

例如:

.byte18

立即數(shù)方式?jīng)]有使用,但匯編器認為操作數(shù)是一個數(shù)值18(即立即數(shù)),用18數(shù)值初始化一個字節(jié)。2023/3/916DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.注釋

用來說明指令功能的文字,便于用戶閱讀。

注釋可位于句首或句尾,位于句首時,以“*”或“;”開始,位于句尾時,以分號“;”開始。

注釋可單獨一行或數(shù)行;

注釋是任選項。

1100000.bsssym,;保留空間于.bss

**************************************

*改變段,允許第五個‘mylab’定義*

**************************************

例如:2023/3/917DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

匯編器可支持7種類型的常數(shù)(常量)。

數(shù)據(jù)類型舉例說明二進制1110001b或1110001B八進制226q或572Q十進制1234或+1234或-11234缺省型十六進制0A40h或0A40H或0xA40浮點數(shù)1.623e-23僅用于C語言字符‘D’字符串“thisisastring”2023/3/918DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

二進制整型常量最多由16位二進制數(shù)字(0或1)組成,后綴為B(或b)。如果數(shù)字小于16位,匯編器將其右邊對齊,并在前面補零。

1.二進制整數(shù)

例如:10001000B136(十進制)或88(十六進制)0111100b60(十進制)或3C(十六進制)10b2(十進制)或2(十六進制)10001111B143(十進制)或8F(十六進制)

2023/3/919DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

八進制整型常量最多由6位的八進制數(shù)字(0到7)組成,后綴為Q(或q)或前綴為0(零)。

2.八進制整數(shù)

例如:

100011Q32777(十進制)或8009(十六進制)124q84

(十進制)或54(十六進制)

八進制常數(shù)也可使用C語言的記號,即加前綴0。

010001132777(十進制)或8009(十六進制)

0124

84

(十進制)或54(十六進制)

2023/3/920DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

十進制整型常量由十進制數(shù)字串組成,無后綴。取值范圍為:-32

768~32

767或0~65

535。3.十進制整數(shù)

例如:

21182118(十進制)或846(十六進制)

6553565535(十進制)或0FFFF(十六進制)-32768-32768(十進制)或8000(十六進制)

2023/3/921DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

十六進制整型常量最多由4位十六進制數(shù)字組成,帶后綴H(或h)。它必須以數(shù)字(0~9)開始,也可以加前綴0x。4.十六進制整數(shù)

例如:

0DH14(十進制)或000D(十六進制)12BCH4796(十進制)或12BC(十六進制)

十六進制常數(shù)也可用C語言記號,即加前綴0x。

0x0D14(十進制)或000D(十六進制)0x12BC4796(十進制)或12BC(十六進制)

2023/3/922DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

浮點整型常量由一串十進制數(shù)字組成,可以帶小數(shù)點、分數(shù)和指數(shù)部分。5.浮點數(shù)浮點數(shù)的表示方法:

[±][n].[n][E|e][±][n]

n——為一串十進制數(shù),浮點數(shù)前可帶加減號(+或-),且小數(shù)點必須指定。

例如:99.e9——有效的數(shù);99e9——非法。合法:.314,3.14,

-.314e-19。

2023/3/923DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

在程序中使用.set偽指令給一個符號賦值,該符號就成為一個匯編時間常數(shù),等效于一個常數(shù)。

為了使用表達式中的常數(shù),賦給符號的必須是絕對值。

6.

匯編時間常數(shù)

例如:將常數(shù)值18賦給符號bei_hua。

bei_hua

.set18

LD

#bei_hua,A2023/3/924DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計6.

匯編時間常數(shù)

例如:

AuxRl.set

ARl

MVMM

AuxRl,SP

也可以用.set偽指令將符號常數(shù)賦給寄存器名。此時,該符號變成了寄存器的替代名。

注意:常量不能進行符號擴展。

如:0ACH等于十六進制的00AC或十進制172,不等于-84。

2023/3/925DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

字符常數(shù)是包括在單引號內(nèi)的字符串。若單引號之間沒有字符,則值為0。每個字符在內(nèi)部表示為8位ASCII碼。

7.字符常數(shù)

例如:

‘a(chǎn)’內(nèi)部表示為61

h

‘B’

內(nèi)部表示為42

h

2023/3/926DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.2

匯編語言中的常數(shù)與字符串

字符串是由雙引號括起來的一串字符,最大長度是可以變化的,由要求字符串的偽指令來設(shè)置。字符在內(nèi)部用8位ASCII碼來表示。8.字符串

例如:

“example”

定義了一個長度為7的字符串:example

2023/3/927DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計

字符串可用于下列偽指令中:

.copy——作為復(fù)制偽指令中的文件名

.sect——作為命名段偽指令中的段名

.setsect——作為該偽指令中的段地址

.byte——作為數(shù)據(jù)初始化偽指令中的變量名

.string——作為該偽指令的操作數(shù)

8.字符串注意:字符常數(shù)與字符串的差別。

字符常數(shù)代表單個整數(shù)值。

字符串只是一串字符。

2023/3/928DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.3

匯編源程序中的符號

匯編程序中的符號用于標號、常數(shù)和替代字符。

由字母、數(shù)字以及下劃線和美元符號(A~Z,a~z,0~9,_和$)等組成;符號名最多可長達200個字符;在符號中,第1位不能是數(shù)字,并且符號中不能含空格。

2023/3/929DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.3

匯編源程序中的符號

1.

標號

作為標號的符號代表在程序中對應(yīng)位置的符號地址。

通常,標號是局部變量,在一個文件中局部使用的標號必須是唯一的。

助記符操作碼和匯編偽指令名(不帶前綴“.”)為有效標號。

標號分大小寫。

例如:ABC,Abc,abc是3個不同的符號。

在調(diào)用匯編器時使用-c選項,可以不分大小寫。

2023/3/930DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計1.

標號

標號還可以作為.global,.ref,.def或.bss等匯編偽指令的操作數(shù)。

如:.global

label

lable1

NOP

ADD

label,B

B

label12023/3/931DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

符號常數(shù)

符號也可被設(shè)置成常數(shù)值。為了提高程序的可讀性,可以用有意義的名稱來代表一些重要的常數(shù)值。

偽指令.set和.struct/.tag/.endstruct可以用來將常數(shù)賦給符號名。注意:符號常數(shù)不能被重新定義。

5.1.3

匯編源程序中的符號

2023/3/932DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

符號常數(shù)

【例5.1.3】

定義符號常數(shù)舉例。

N.set512buffer.set

4*Nnzg1.set1nzg2.set2nzg3.set3item.struct

.int

nzg3

tang.endstruct

array.tagitem

.bssarray,tang*N;定義常數(shù)

;item結(jié)構(gòu)定義

;常數(shù)偏移nzg1=1;常數(shù)偏移nzg2=2

;常數(shù)偏移nzg2=3

;聲明數(shù)組

2023/3/933DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.

定義符號常數(shù)

使用-d選項可以將常數(shù)值與一個符號等同起來。

定義符號常數(shù)后,在匯編源文件中可用符號代替和它等同的值。

5.1.3

匯編源程序中的符號

定義格式:

asm500

-d

name=[value]

匯編命令

匯編選項

符號名稱

符號的值

若value省略,則符號的值設(shè)置為l。

2023/3/934DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.

定義符號常數(shù)

檢測類型及偽指令

檢測類型

使用的偽指令

存在不存在與值相等與值不等

.if$isdefed("name").if$isdefed("name")=0.ifname=value

.ifname!=value

注意:內(nèi)部函數(shù)$isdefed中的變量必須括在雙引號內(nèi)。

引號表明變量按字面解釋而不是作為替代字符。

2023/3/935DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.預(yù)先定義的符號常數(shù)

匯編器有若干預(yù)先定義符號,包括:

5.1.3

匯編源程序中的符號

美元符號$,代表段程序指針SPC的當前值;

②映像寄存器符號,包括AR0~AR7;

映像寄存器由匯編器設(shè)置為符號。用于指定存儲器模式。由-mk選項設(shè)置,默認值為0。

2023/3/936DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

替代符號

可將字符串值(變量)賦給符號,使符號名與該變量等效,成為字符串的別名,這種用來代表變量的符號稱為替代符號。

5.1.3

匯編源程序中的符號

當匯編器遇到替代符號時,將用字符串值替代符號。和符號常數(shù)不同,替代符號可以被重新定義。可在程序中的任何地方將變量賦給替代符號。

例如:

.asg

"high",AR2

;寄存器AR2

2023/3/937DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

局部標號

局部標號是一種特殊的標號,使用的范圍和影響是臨時性的。

5.1.3

匯編源程序中的符號

定義方法:

注意:局部標號不能用偽指令來定義。

用$n來定義。n是0~9的十進制數(shù);②

用NAME?定義。NAME是任何一個合法的符號名。匯編器用緊隨其后一個唯一數(shù)值的句點代替問號。

2023/3/938DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

局部標號

局部標號可以被取消定義,并可以再次被定義或自動產(chǎn)生。

取消局部變量的方法:①

使用.newblock偽指令;②

使用偽指令.sect,.text或.data改變段

;③

使用偽指令.include或.copy,進入include文件;④

達到include文件的結(jié)尾,離開include文件。

2023/3/939DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

局部標號【例5.1.4】合法、非法局部標號$n舉例。

假設(shè)符號ADDRA,ADDRB,ADDRC已經(jīng)在前面作了定義。

Label1:LDADDRA,A

SUBADDRB,A

BC$1,ALT

LDADDRB,AB$2

$1LDADDRA,A$2ADDADDRC,A

.newblock

BC$1,ALTSTLA,ADDRC$1NOP

;將ADDRA裝入累加器A

;減去地址B

;如果小于0,分支轉(zhuǎn)移到$1

;否則將ADDRB裝入累加器A

;分支轉(zhuǎn)移到$2

;$1:將ADDRA裝入累加器A

;$2:加上ADDRC

;取消$1的定義,使它可被再次使用

;若小于0,分支轉(zhuǎn)移到$1

;存ACC的低16位到ADDRC

.newblock

.newblockBC$1,ALT;若小于0,分支轉(zhuǎn)移到$1STLA,ADDRC;存ACC的低16位到ADDRC$1NOP

;錯誤:$1被多次定義

2023/3/940DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計【例5.1.5】name?形式的局部標號的使用方法。

;********************************************;局部標號’mylab’的第1個定義;********************************************

NOP

mylab?NOPBmylab?;*******************************************.copy“a.inc”

;*******************************************

mylab?NOPBmylab?

;包括文件中有‘mylab’第2次定義

;從包括文件中退出復(fù)位后,‘mylab’的第3個定義2023/3/941DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計【例5.1.5】name?形式的局部標號的使用方法。

;********************************************;在宏中‘mylab’的第4個定義,;為了避免沖突,宏使用不同的名稱空間

;********************************************

maymac.macro

mylab?NOP

Bmylab?.endm

;*******************************************

mymac

Bmylab?

;宏調(diào)用。引用‘mylab'的第3個定義

;既不被宏調(diào)用復(fù)位,也不與定義在宏中的相同名沖突2023/3/942DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計【例5.1.5】name?形式的局部標號的使用方法。

;********************************************;改變段,允許‘mylab'的第5個定義;********************************************

.sect

“Secto_One”NOP

mylab?.word0

NOP

NOPBmylab?

2023/3/943DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計【例5.1.5】name?形式的局部標號的使用方法。

;********************************************;.newblock偽指令,允許‘mylab'的第6個定義

;********************************************

.newblockmylab?.word0

NOP

NOPBmylab?

2023/3/944DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.4

匯編源程序中的表達式表達式可以是常數(shù)、符號,或者是由算術(shù)運算符分開的一系列常數(shù)和符號。

有效表達式的值:-32

768~32

767

影響表達式的主要因素:

圓括號()。圓括號內(nèi)的表達式最先計算;

不能用大括號{}或中括號[]代替圓括號()。

優(yōu)先級?!疌54x匯編器使用與C語言相似的優(yōu)先級,優(yōu)先級高的先計算;

從左到右運算。具有相同的優(yōu)先級,按從左到右的順序計算。序號符號運算操作求值順序1+-~!取正、取負、按位求補、邏輯負

從右至左2*/%乘法、除法、求模從左至右3+-加法、減法從左至右4^指數(shù)

從左到右

5<<>>左移、右移從左至右6<<=小于、小于等于從左至右7>>=大于、大于等于從左至右8!==不等于、等于從左至右9&按位與運算從左至右10∧

按位異或運算從左至右11|按位或運算從左至右2023/3/945DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.4

匯編源程序中的表達式1.

運算符

’C54x匯編器使用與C語言相似的優(yōu)先級。

取正(+)、負(-)和乘(*)比二進制形式有較高的優(yōu)先級。

2.

條件表達式

匯編器支持關(guān)系運算符,可以用于任何表達式。

=

等于==等于!=不等于

>=

大于或等于<=

小于或等于

>

大于

<

小于

2023/3/946DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.4

匯編源程序中的表達式3.

有效定義的表達式

某些匯編器要求有效定義的表達式作為操作數(shù)。操作數(shù)是匯編時間常數(shù)或鏈接時可重定位的符號。

有效定義的表達式是指表達式中的符號或匯編時間常數(shù)在表達式之前就已經(jīng)被定義。

有效定義的表達式的計算必須是絕對的。

2023/3/947DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.

有效定義的表達式

【例5.1.6】

有效定義的表達式。.data

label1.word0.word1.word2label2.word3X.set50h

goodsym1.setl00h

+

X

goodsym2.set$

goodsym3.set

label1

goodsym4.set

label2-label1;將16位值0,1,2放入標號為

label1的當前段連續(xù)字中;有效定義的表達式;引用已定義的所有局部標號;有效定義的表達式;定義X的值;將3放入標號為label2的字中2023/3/948DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.

有效定義的表達式

【例5.1.7】無效定義的表達式。

.globalY

badsym1.setYbadsym2.set50h+Y

badsym3.set50h

+

ZZ.set60h;定義Y為全局外部符號;Y在當前文件中未定義

;無效的表達式;無效的表達式,Z還未定義;定義Z,但應(yīng)在表達式使用之前2023/3/949DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.4

匯編源程序中的表達式4.

表達式上溢和下溢

匯編時執(zhí)行了算術(shù)操作以后,匯編器檢查上溢和下溢的條件。當出現(xiàn)上溢或下溢時,匯編器會發(fā)出一個值被截斷了的警告。

匯編器不檢查乘法的溢出狀態(tài)。2023/3/950DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.1.4

匯編源程序中的表達式5.

可重新定位符號和合法表達式

對于絕對符號、可重新定位符號以及外部符號的有效操作,可參見下表。

帶有絕對符號和可重新定位符號的表達式

如果A為…

并且B為…

A+B為…

A-B為…

絕對絕對絕對可重新定位可重新定位可重新定位外部外部外部

絕對外部可重新定位絕對可重新定位外部絕對可重新定位外部絕對外部可重新定位可重新定位非法非法外部非法非法絕對非法非法可重新定位絕對非法外部非法非法2023/3/951DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

可重新定位符號和合法表達式表達式不能包含可重新定位符號和外部符號的乘或除;

表達式中不能含有對其他的段為可重新定位的符號;

用.global偽指令定義為全局的符號和寄存器也可以用在表達式中。這些符號和寄存器被聲明為外部符號;

可重新定位的寄存器也可以用在表達式中,這些寄存器的地址相對于定義它們的寄存器段是可重新定位的,除非將它們聲明為外部符號。2023/3/952DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

可重新定位符號和合法表達式

例如:在下面的程序中,使用了4個定義在相同段的符號。

.globalextern_1

intern_1:.word

‘’’D’

LAB1:.set2

intern_2:.word3

LD#LAB1+((5+4)*3),A

LD#LAB1+3+(4*7),A

.globalextern_1

intern_1:.word

‘’’D’

LAB1:.set2

intern_2:.word3

LD#LAB1+((5+4)*3),A

LD#LAB1+3+(4*7),A;定義在外部的全局符號

;定義在現(xiàn)行模塊中,可重新定位

;LAB1=2,絕對符號

;定義在現(xiàn)行模塊中,可重新定位

;LAB1為絕對符號,A=29

;LAB1為絕對符號,A=33

2023/3/953DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

可重新定位符號和合法表達式

所有合法表達式可以化簡為兩種形式:

可重新定位符號±絕對符號;

絕對符號。單操作數(shù)運算僅能應(yīng)用于絕對符號,不能應(yīng)用于可重新定位符號。

表達式簡化為僅含有可重新定位符號是非法的。2023/3/954DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

可重新定位符號和合法表達式【例5.1.8】判斷下列指令中表達式的合法性。

LD

extern_1-10,B

LD

10-extern_1,B

LD-(intern_1),B

LD

extern_1/10,B

LD

intern_1+extern_1,B可重新定位

合法

不可將重新定位符號變負可重新定位符號不可變負

非法

可重新定位符號不可乘除

非法

可重新定位+可重新定位=非法

非法

非法

2023/3/955DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

可重新定位符號和合法表達式【例5.1.9】判斷下列指令中表達式的合法性。

LDintern_1-intern_2+extern_1,B

LDintern_1+intern_2+extern_1,B

LDintern_1+extern_1-intern_2,B可重新定位可重新定位可重新定義-可重新定義=絕對符號絕對符號可重新定位絕對符號+可重新定位合法可重新定義+可重新定義=非法非法可重新定義+可重新定義=非法非法2023/3/956DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.2

堆棧的使用方法

當程序調(diào)用中斷服務(wù)程序或子程序時,需要將程序計數(shù)器PC的值和一些重要的寄存器值進行壓棧保護,以便程序返回時能從間斷處繼續(xù)執(zhí)行。’C54x提供一個用16位堆棧指針SP尋址的軟件堆棧。當向堆棧中壓入數(shù)據(jù)時,堆棧是從高地址向低地址方向填入,堆棧指針SP先減1,然后將數(shù)據(jù)壓入堆棧。當從堆棧中彈出數(shù)據(jù)時。數(shù)據(jù)先從堆棧中彈出,然后堆棧指針SP加1。2023/3/957DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.2

堆棧的使用方法

1.

堆棧的設(shè)置

size.set120stack.usect“STACK”,sizeSTM#

stack

+

size,SP

在數(shù)據(jù)RAM空間開辟一個堆棧區(qū)。

在RAM中定義一個STACK的保留空間,共120個單元

設(shè)置堆棧指針,#

stack+size→SP。保留區(qū)的高地址賦給SP,作為堆棧的棧底

若程序中要使用堆棧,必須先進行設(shè)置,如:

設(shè)置好堆棧后,就可以使用堆棧了,如:

CALLpmad;(SP)-1→SP,(PC)+2→TOS,pmad→PCRET;(TOS)→PC,(SP)+1→SP

2023/3/958DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

堆棧區(qū)大小的確定①

先開辟一個較大的堆棧區(qū),用已知數(shù)充填,如:

LD#

-9224,BSTM#

length,AR1MVMMSP,AR4loop:STLB,*AR4-

BANZloop,*AR1-

堆棧區(qū)的大小可以按照以下步驟來確定:

;堆棧區(qū)要充填的數(shù)0DBF8h加載B

;設(shè)置循環(huán)次數(shù)

;設(shè)置數(shù)據(jù)指針AR4,SP→AR4

;循環(huán),充填數(shù)據(jù)

數(shù)據(jù)RAMDDD……DDSP→DDBF8DBF8DBF8……DBF8DBF8DBF8AR4→length2023/3/959DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

堆棧區(qū)大小的確定①

先開辟一個較大的堆棧區(qū),用已知數(shù)充填。

堆棧區(qū)的大小可以按照以下步驟來確定:

數(shù)據(jù)RAMAR4→DBF8DBF8DBF8……DBF8DBF8SP→DBF86B140013…SP→②

運行程序,執(zhí)行所有堆棧操作。

檢查堆棧中的數(shù)值。7AB3

用過的堆棧區(qū)就是實際需要的堆??臻g。用過的棧區(qū)2023/3/960DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3

控制程序’C54x具有豐富的程序控制指令,利用這些指令可以執(zhí)行分支轉(zhuǎn)移、子程序調(diào)用、子程序返回,條件執(zhí)行以及循環(huán)等控制操作。5.3.1

分支操作程序

程序控制中的分支操作包括:

分支轉(zhuǎn)移程序子程序調(diào)用子程序返回條件操作程序

2023/3/961DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3.1

分支操作程序

通過傳送控制到程序存儲器的其他位置,分支轉(zhuǎn)移會中斷連續(xù)的指令流。

分支轉(zhuǎn)移指令可以改寫PC值,使程序改變流向。其指令分為無條件分支轉(zhuǎn)移和條件分支轉(zhuǎn)移兩類。兩者都可以帶延時操作和不帶延時操作。

1.

分支轉(zhuǎn)移程序

分支轉(zhuǎn)移指令

分類

指令

說明

無條件分支轉(zhuǎn)移

B[D]

用該指令指定的地址加載PC

BACC[D]

用累加器的低16位指定的地址加載PC條件分支轉(zhuǎn)移

BC[D]

若滿足指令給定條件,用該指令指定的地址加載PC

BANG[D]

若當前選擇輔助寄存器不等于0,用該指令指定的地址加載PC遠程分支轉(zhuǎn)移

FB[D]

用該指令指定的地址加載PC和XPC

FBACC[D]

用累加器的低23位指定的地址加載PC和XPC2023/3/962DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計

無條件分支轉(zhuǎn)移:無條件執(zhí)行分支轉(zhuǎn)移;

條件分支轉(zhuǎn)移:要在滿足用戶一個或多個條件時才執(zhí)行分支轉(zhuǎn)移;

遠程分支轉(zhuǎn)移:允許分支轉(zhuǎn)移到擴展存儲器。

1.

分支轉(zhuǎn)移程序

【例5.3.1】分支轉(zhuǎn)移舉例。

STM#88H,AR0

LD#1000H,A

zhong:SUBAR0,A

BCzhong,AGT,AOV

;將操作數(shù)#88H裝入AR0

;將操作數(shù)#1000H裝入ACC

;將A中的內(nèi)容減去AR0中的

;內(nèi)容結(jié)果裝入A

;若累加器A>0且溢出,

;則轉(zhuǎn)至zhong,否則往下執(zhí)行

2023/3/963DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3.1

分支操作程序

與分支轉(zhuǎn)移一樣,通過傳送控制到程序存儲器的其他位置,子程序調(diào)用會中斷連續(xù)的指令流。但是與分支轉(zhuǎn)移不同的是,這種傳送是臨時的。

當函數(shù)的子程序被調(diào)用時,緊跟在調(diào)用后的下一條指令的地址保存在堆棧中。這個地址用于返回到調(diào)用程序并繼續(xù)執(zhí)行調(diào)用前的程序。

子程序調(diào)用操作分成兩種形式:無條件調(diào)用和條件調(diào)用,兩者都可以帶延時操作和不帶延時操作。

2.

子程序調(diào)用程序2023/3/964DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

子程序調(diào)用程序子程序調(diào)用指令分類

指令

說明

無條件調(diào)用

CALL[D]將返回的地址壓入堆棧,并用該指令指定的地址加載PC

CALA[D]將返回的地址壓入堆棧,用累加器A或B指定的地址加載PC條件調(diào)用

CC[D]

如果滿足指令給定條件,將返回的地址壓入堆棧,并用該指令指定的地址加載PC遠程調(diào)用

FCALL[D]將XPC和PC壓入堆棧,并用該指令指定的地址加載PC和XPC

FCALA[D]將XPC和PC壓入堆棧,用累加器的低23位指定的地址加載

PC和XPC2023/3/965DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

子程序調(diào)用程序

無條件調(diào)用是指無條件執(zhí)行調(diào)用。

條件調(diào)用和無條件調(diào)用操作相同,但是條件調(diào)用要在滿足一個或多個條件時才執(zhí)行調(diào)用。

遠程調(diào)用允許對擴展存儲器的子程序或函數(shù)進行調(diào)用。

2023/3/966DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計2.

子程序調(diào)用程序【例5.3.2】

子程序調(diào)用舉例。

STM#123H,AR0LD#456H,AR1CALLnewLDAR1,16,Anew:MPYAR0,AR1,A

RET

;將操作數(shù)#123H裝入AR0

;將操作數(shù)#456H裝入AR1

;調(diào)子程序new

;將AR1的內(nèi)容左移16位后裝入A

;AR0與AR1的內(nèi)容相乘,結(jié)果放入A中

;子程序返回

2023/3/967DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3.1

分支操作程序

子程序返回程序可以使程序重新在被中斷的連續(xù)指令處繼續(xù)執(zhí)行。

返回指令通過將彈出堆棧的值(包含將要執(zhí)行的下一條指令的地址),送到程序計數(shù)器PC來實現(xiàn)返回功能。

’C54x可以執(zhí)行無條件返回和條件返回,并且它們都可以帶延時或不帶延時操作。

3.

子程序返回程序2023/3/968DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.

子程序返回程序子程序返回指令分類

指令

說明

無條件返回

RET[D]將堆棧頂部的返回地址加載到PC。

RETE[D]

將堆棧頂部的返回地址加載到PC,并使能可屏蔽中斷。

RETF[D]

將RTN寄存器中的返回地址加載到PC,并使能可屏蔽中斷。

條件返回

RC[D]如果滿足指令給定條件,將堆棧頂部的返回地址加載到PC。遠程返回

FCALL[D]將堆棧頂部的值彈出加載到XPC,

將堆棧中下一個值彈出加載到PC。

FCALA[D]將堆棧頂部的值彈出加載到XPC,

將堆棧中下一個值彈出加載到PC,并使能可屏蔽中斷。2023/3/969DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計3.

子程序程序

無條件返回是無條件執(zhí)行返回操作。

條件返回可以給予被調(diào)用函數(shù)或中斷服務(wù)程序(ISR)更多的返回方式,以便根據(jù)被處理的數(shù)據(jù)選擇返回路徑,通過使用條件返回指令來實現(xiàn)返回。

遠程返回允許從擴展存儲器的子程序或函數(shù)返回。

2023/3/970DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3.1

分支操作程序

’C54x的一些指令只有在滿足一個或是多個條件后才被執(zhí)行,如條件分支轉(zhuǎn)移、條件調(diào)用和條件返回等指令。

這些指令都用條件來限制分支轉(zhuǎn)移、調(diào)用和返回操作。這些條件可用條件算符來表示。

4.

條件操作程序2023/3/971DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.

條件操作程序條件算符操作符號條件說

明操作符號條件說

明AEQA=0累加器A等于0

AOVAOV=1累加器A溢出BEQB=0累加器B等于0

BOVBOV=1累加器B溢出ANEQA0累加器A不等于0

ANOVAOV=0累加器A不溢出BNEQB0累加器B不等于0

BNOVBOV=0累加器B不溢出ALTA<0累加器A小于0

CC=1ALU進位位置1

BLTB<0累加器B小于0

NCC=0ALU進位位置0

ALEQA0累加器A小于等于0

TCTC=1測試/控制標志位置1

BLEQB0累加器B小于等于0

NTCTC=0測試/控制標志位置0

AGTA>0累加器A大于0

BIOBIO低BIO信號電平為低BGTB>0累加器B大于0

NBIOBIO高BIO信號電平為高AGEQA0累加器A大于等于0

UNC無無條件操作BGEQB0累加器B大于等于0

2023/3/972DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.

條件操作程序

在條件操作時也可以要求有多個條件,只有所有條件滿足時才被認為是滿足條件。這種多個條件的組合就構(gòu)成了指令的多重條件。多重條件算符第1組第2組A類B類A類B類C類EQ

NEQLEQGEQLT

GTOVNOVTCNTCCNCBIONBIO2023/3/973DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.

條件操作程序

選用多重條件時應(yīng)當注意以下幾點:

第1組:分為兩類,最多可選擇兩個條件,

組內(nèi)兩類條件可以與/或構(gòu)成多重條件,但不能用組內(nèi)同類條件構(gòu)成與/或多重條件。

③組與組之間可用或構(gòu)成多重條件。

當選擇兩個條件時,累加器必須是同一個。例如,可以同時選擇AGT和AOV,但不能同時選擇AGT和BOV。

②第2組:分為三類,最多可選三個條件,可以在每類中各選一個條件進行與/或構(gòu)成多重條件,但不能在同類選兩個以上條件。

例如,可以同時測試TC、C和BIO,但不能同時測試NTC、C和NC。2023/3/974DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.

條件操作程序【例5.3.3】

條件操作程序。

BCsub,BLEQ

;條件分支轉(zhuǎn)移

若累加器B≤0,則轉(zhuǎn)至sub,

否則,往下執(zhí)行

CCstart,AGEQ,AOV

;條件調(diào)用

若累加器A≥0且溢出,

則調(diào)用start,否則往下執(zhí)行

RCNTC

;條件返回

若TC=0,則返回,否則往下執(zhí)行

2023/3/975DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計4.

條件操作程序注意:

若需要多個條件相與時,用單條指令表示。

如:BCnew,AGT,AOV

轉(zhuǎn)移條件:AGT和AOV的與邏輯

若需要兩個條件相或時,需用兩條指令分別表示。

如:若累加器A大于0或溢出,則轉(zhuǎn)移至sub

轉(zhuǎn)移條件:AGT和AOV的或邏輯

BCsub,AGT

BCsub,AOV2023/3/976DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3.1

分支操作程序5.

比較轉(zhuǎn)移程序

利用比較指令CMPR可實現(xiàn)比較轉(zhuǎn)移操作。比較操作指令:

CMPR測試條件,輔助寄存器ARx

指令功能:輔助寄存器ARx與AR0進行比較,若比較結(jié)果使所給定的測試條件成立,則TC位置1。實現(xiàn)方法:①通過CMPR的比較結(jié)果得TC值;

②根據(jù)TC值,由條件轉(zhuǎn)移指令實現(xiàn)分支轉(zhuǎn)移。

2023/3/977DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.

比較轉(zhuǎn)移程序例如:比較操作后條件分支轉(zhuǎn)移

STM#5,AR1

;AR1=5

STM

#10,AR0

;AR0=10loop:

…*AR1+

;AR1=AR1+1

CMPRLT,AR1

;若AR1-AR0<0,則TC=1,否則為0

BCloop,TC

;若AR1-AR0<0,則循環(huán)

若AR1=AR0,則順序執(zhí)行2023/3/978DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3

控制程序5.3.2

循環(huán)操作程序

在程序設(shè)計時,經(jīng)常需要重復(fù)執(zhí)行某一段程序。利用BANZ(當輔助寄存器不為0時轉(zhuǎn)移)指令可實現(xiàn)循環(huán)計數(shù)和操作。

循環(huán)操作指令:

BANZ轉(zhuǎn)移地址,輔助寄存器

指令功能:當輔助寄存器不為0時,則轉(zhuǎn)至轉(zhuǎn)移地址,否則順序執(zhí)行。

2023/3/979DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.3.2

循環(huán)操作程序【例5.3.4】

.bssx,10;給x保留10個空間.bssy,1;給y保留1個空間STM#x,AR1;設(shè)置數(shù)據(jù)段的首地址

STM

#9,AR2;設(shè)置循環(huán)計數(shù)值LD#0,A;累加器清0loop:

ADD*AR1+,A

;累加運算,并修改地址

BANZloop,*AR2-;若計數(shù)值不為0,則循環(huán),并計數(shù)值減1若計數(shù)值為0,則結(jié)束循環(huán)

STLA,@y;累加和存入y中

用AR2作為循環(huán)計數(shù)器,由BANZ實現(xiàn)程序的循環(huán)控制。注意:BANZloop,*AR2-;先判斷,再修正AR2=AR2-12023/3/980DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.4

算術(shù)運算程序

基本算術(shù)運算包括:

加減法和乘法運算除法運算長字和并行運算

2023/3/981DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.4

算術(shù)運算程序

5.4.1

加、減法和乘法運算在數(shù)字信號處理中,加法和乘法運算是最常見的算術(shù)運算?!纠?.4.1】計算y=a

x+b程序:

LD@a,T

;取a值,T=aMPY@x,B

;完成ax乘積,B=axADD@b,B

;完成ax+b運算,B=ax+bSTLB,@y

;計算結(jié)果存入y中2023/3/982DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.4.1

加、減法和乘法運算【例5.4.2】計算y=xl

al+x2

a2

程序:

LD@x1,TMPY@a1,BLD@x2,TMAC@a2,BSTLB,@ySTHB,@y+1;T=x1;B=x1a1;T=x2;乘法累加,B=x1a1+x2a2;計算結(jié)果的低字BL存入y中;計算結(jié)果的高字BH存入y+1中2023/3/983DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.4.1

加、減法和乘法運算【例5.4.3】計算y=

程序:

*********************************************example.asm*********************************************

.title“example.asm”

.mmregs

stack.usect“STACK”,10h

.bssa,4

.bssx,4.bssy,1.defstart.data

;為堆棧指定空間

;為變量分配9個字的空間2023/3/984DSP原理及應(yīng)用第5章TMS320C54x匯編語言程序設(shè)計5.4.1

加、減法和乘法運算【例5.4.3】計算y=

程序:

table:

.word1,2,3,4

.word8,6,4,2.text

start:STM#0,SWWSR

STM#STACK+10h,SP

STM#a,AR1RPT#7

MVPDtable,*AR1+

CALLSUM

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論