《DSP技术及应用》课件第5章_第1页
《DSP技术及应用》课件第5章_第2页
《DSP技术及应用》课件第5章_第3页
《DSP技术及应用》课件第5章_第4页
《DSP技术及应用》课件第5章_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章TMS320C54xDSP汇编指令5.1汇编程序格式5.2汇编表达式

5.3指令中的符号及缩写5.4指令系统5.5可重复和不可重复执行的指令5.6汇编伪指令汇编语言源程序文件包含三大汇编语言要素:汇编指令、汇编伪指令和宏命令,它们之间的有机组合可完成特定的程序功能。

汇编语言编程有助记符指令集和代数指令集两种,但这两种指令集不能混用。本章介绍助记符指令集,后续章节使用的也是助记符指令。DSP汇编源程序的后缀为.asm,就是assembler(汇编)的缩写。

5.1汇编程序格式

助记符指令一般由以下四部分(字段)组成,其中有中括号([])的部分为可选项。

[标号][:]助记符[操作数,…][;注释]助记符指令的书写规则如下:

(1)所有包含伪指令的语句必须在一行内列出;

(2)对于其他指令,如果某行的最后加了反斜杠(\),表示下一行是该行的继续;

(3)所有语句必须以标号、空格或分号开始;

(4)标号为可选项,如果使用,必须从一行的第一列位置(行首)开始,标号的冒号(:)为可选项,不作为标号的一部分;

(5)各字段之间必须用一个或多个空格分开,制表符Tab键等效于空格,而且能实现自动对齐;

(6)注释为可选项,如果使用则以分号(;)开始。

以上除注释可以使用中文字符外,其他均为英文字符。

1.标号

标号由A~Z、a~z、0~9、_和$等符号组成,区分大小写,最长可达32个字符,但第一个字符不能是数字。标号后面可以带冒号(:),但冒号不作为标号的一部分。

如果使用标号,标号的值就是段程序计数器(SPC)的当前值,也就是该行代码开始存储的地址。

例5.1中是一段用汇编语言编写的FIR滤波函数程序,其中_FIR是一个标号,表示这段代码的入口地址。标号_FIR以下划线(_)开始,可以在C语言程序文件中进行调用。因为C文件的函数名经编译后,会自动在函数名前加下划线(_)。例5.1一段FIR滤波函数程序。

_FIR:

;保护子程序用到的辅助寄存器

FRAME

-1;FRAME用于开辟局部帧,保护主函数传递来的局部变量

PSHM

AR2

PSHM

AR3

PSHM

ST1;ST1含有SXM、FRCT、OVM等控制位

STM#_input_mix,input_mix_P

LD*input_mix_P,A;将当前采样值载入到A中

CALLfir;滤波结果也返回至A中

;恢复辅助寄存器和原来的运算状态

POPMST1

POPMAR3

POPMAR2

FRAME1

RET

2.助记符

助记符不能从一行的第一列开始书写,否则被认为是标号。助记符中还包括伪指令或宏调用。

3.操作数

操作数字段是一个操作数列表,根据指令要求操作数可以有一个或多个,也可能没有操作数。操作数之间用逗号(,)隔开,它可以是常数、符号或符号表达式,其前缀规定如下所述。

前缀#:表示其后的操作数为立即数。

前缀*:表示其后的操作数为间接寻址。

ADD#123,B;将立即数123(十进制)加到累加器B上

LD*AR1,A;将AR1所指向的单元内容装载到累加器

A中

各种数据的前后缀规定如下:

二进制整数,其后加B或b,最多16位,不足16位,其高位用0填充。

八进制整数,其后加Q或q,或者在其前面加数字0,最多6位,不足6位,其高位用符号位填充。十进制整数,由十进制字符组成,范围为-32768~65535。

十六进制整数,其后加H或h,或者在其前面加字符0x,必须以数字0~9开始,最多4位,不足4位,其高位用符号位填充。

浮点数,IEEE-32bit格式,输入格式如下:

[±][nnn.nnn]e[±nnn]数据范围从1.175494e-38到3.40282346e38,除非写成整

数形式,否则小数点不能省略。如3.e5合法,而3e5则非法,编译器不能识别。nnn均为十进制字符,指数为以10为底的

指数。

操作数可以使用以下符号来表示。

(1)用.global、.def和.ref定义的全局标号,用$或name?定义的局部标号。全局标号具有系统唯一性,不能重新定义;局部标号只有局部意义,在同一个汇编程序中可重新定义和使用。

(2)用.set定义的符号常数。

(3)用.mmregs定义的映射寄存器符号。

(4)用.asg定义的替代符号等。

4.注释

注释可以从一行的任意列开始,除第一符号是分号(;)

外。注释中可以使用ASCII字符、空格以及中文字符,建

议多加注释,以增加程序的可读性。

5.2汇编表达式

表达式是由运算符组合起来的常数或符号构成的,它的值必须是唯一或绝对的,有效值范围为-32768~32767。表5.1列出了汇编表达式中可用的运算符,C54x汇编器使用和C语言一样的优先级表示,用小括号(())可以改变优先顺序。

5.3指令中的符号及缩写

在介绍C54x指令系统之前,应先说明指令系统中使用的符号和缩写,如表5.2所示。

5.4指令系统

TMS320C54x的指令集包含四种基本类型的操作,分别如下:

(1)加载和存储指令,包括加载、存储以及条件存储和复合加载存储的指令等。

(2)程序控制指令,包括分支转移、调用、中断、返回、重复等程序控制指令。

(3)算术运算指令,包括加法、减法、乘法、乘累加、32位操作数运算以及其他一些专用指令。

(4)逻辑运算指令,包括与、或、异或、移位和测试指令等。5.4.1加载和存储指令

C54x的加载和存储指令包括加载指令、存储指令、条件存储指令和混合加载存储指令,如表5.3所示。5.4.2程序控制指令

C54x的程序控制指令包括分支转移指令、子程序调用指令、中断指令、返回指令、重复指令、堆栈操作指令以及混合程序控制指令,如表5.4所示。5.4.3算术运算指令

C54x的算术运算指令包括加法指令、减法指令、乘法指令、乘累加和乘减指令、双字/双精度运算指令以及专用指令,如表5.5所示。5.4.4逻辑运算指令

C54x的逻辑运算指令包括与指令、或指令、异或指令、移位指令以及测试指令,如表5.6所示。5.4.5并行操作指令

C54x的并行操作指令包括并行装载和存储指令、并行存储加/减指令和并行存储乘法指令,如表5.7所示。

5.5可重复和不可重复执行的指令

5.5.1重复执行时变成单周期的多周期指令

下列指令单独执行时为多周期执行指令,执行周期为2~5个周期不等。但当用RPT重复执行时,在指令流水线下均变成单周期指令,同样可以达到非常快的速度。

(1)滤波运算类指令有FIRS、MACD和MACP。

(2)数据传送类指令有MVDK、MVDM、MVDP、MVKD、MVMD、MVPD、READA和WRITA。5.5.2不可重复执行的指令

下列指令不能建立指令流水线执行过程,因而不能用RPT重复执行,时间效率较低。

(1)运算类指令有ADDM、ANDM、ORM、XORM和RND。

(2)加载存储类指令有LDARP或DP、DST和MVMM。

(3)程序控制类指令基本不能重复执行,不能重复执行的程序控制指令分别如下。①分支转移指令:B[D]、BACC[D]、BANZ[D]、BC[D]、FB[D]和FBACC[D];

②子程序调用指令:CALA[D]、CALL[D]、CC[D]、FCALA[D]和FCALL[D];

③中断指令:INTR和TRAP;

④返回指令:FRET[D]、FRETE[D]、RC[D]、RET[D]、RETE[D]和RETF[D];⑤重复指令:RPT、RPTZ和RPTB[D];

⑥混合程序控制指令:IDLE、RESET、RSBX、SSBX和XC。

(4)其他不能重复执行的指令是CMPR。

5.6汇编伪指令

汇编伪指令为程序提供数据并控制汇编过程,主要功

能有:

(1)变量定义、分配存储空间,常量初始化;

(2)代码段定义等操作;

(3)调用其他文件、条件汇编、提取宏等操作;

(4)调试信息、输出列表等操作。5.6.1变量定义和常数初始化

有关变量定义及常数初始化的伪指令有:

.mmregs

定义存储器映射寄存器(MMR)的符号。使用这条指令后,凡是存储器映射寄存器都可直接使用此符号,而不必逐一定义其地址。

.defsymbol1[,symbol2,…]在当前文件中定义一个或多个符号,可以被其他文件

引用。

.refsymbol1[,symbol2,…]

在当前文件中引用其他文件中定义的一个或多个符号。.globalsymbol1[,symbol2,…]

定义一个或多个全局(外部)符号,可以是C文件定义的

符号。

.intvalue1[,value2,…]初始化一个或多个16位整数,其首地址由.int前面的标号决定,个数由数据个数决定。如汇编伪指令:

K1:.int3,5,7

相当于下面的C语言语句:

K1[3]=[3,5,7];

编译器在编译数据时,一般是先编译全部数据,再将数据截短为16位的数据,而不检查数据超出范围之类的错误。数据本身的错误由程序编写人员负责处理。

.wordvalue1[,value2,…]

此伪指令的功能和用法与.int的功能和用法相同。

.floatvalue1[,value2,…]

初始化一个(段)浮点数。一个浮点数占用2个字的存储单元,其存储格式如图5.1所示。图5.1一个浮点数的存储格式其中,s为一个1位符号域,e为8位有偏指数,f为23位小数,高16位在低地址,低16位在高地址,且自动对齐偶字边界,即低地址在偶地址上。假设数据段(.data)地址从0x100开始,如例5.2所示,则3.14从0x0102地址开始存储,0x0101单元空着。

.doublevalue1[,value2,…]

此伪指令的功能和用法与.float的功能和用法相同。

.longvalue1[,value2,…]

初始化一个或多个32位整数,高16位在低地址(偶地址),低16位在高地址,且自动对齐偶字边界。

.string“string1”[,“string2”,…]

初始化一个或多个文本字符串。每个字符为8位数据,但仍用一个字单元(16位)保存,高8位填充为0。

.charvalue1[,value2,…]

.bytevalue1[,value2,…]

初始化一个或多个字节,用法同伪指令.string。

.set

将前面的标号定义为符号常量,如:

K:

.set3//编译时将K换成3

.asg定义替代符号,编译时将前面的字符串替代为后面的符号。如编译以下两行代码:

.asg

AR1,DATA_P1//DATA_P1是AR1的别名

.asgAR1,DATA_P2//DATA_P2是AR1的别名

编译器将DATA_P1和DATA_P2都替换成AR1,或者说,AR1可以有多个别名。

.align[sizeinwords]将SPC(段指针)调整到一个由sizeinwords(2的整数次幂)指定的字边界,以满足某些特殊寻址的要求。sizeinwords默认为128字(页边界)。如在例5.2中,若在f1前面一行加上“.align”,则f1从0x180开始存储,

*(0x0180)=0x4048,*(0x0181)=0xF5C3。

.space[sizeinbits]

在当前段保留size个比特存储空间。若需要保留多少个字的空间,可将size定义为16的整数倍,如“.space4*16”。

.even

将SPC(段指针)调整到一个偶字边界,它相当于“.align2”伪指令。5.6.2段定义相关伪指令

.text

汇编到.text段(可执行代码段),.text段为系统默认产生的程序段名。

.data

汇编到.data段(已初始化数据段),.data段为系统默认产生的已初始化数据段名。

.bsssymbolsizeinwords[,[blockingflag][,alignmentflag]]

定义一个未初始化段,为symbol变量分配sizeinwords个字的存储空间,可以指定分块标志(blockingflag)和存储边界(alignmentflag)。.bss段为系统默认产生的未初始化数据段

名。如:

.bssbuffer,K_size,1,128

//为变量buffer分配K_size个存储单元,1段,对齐128字边界.sect“sectionname”定义已初始化命名段,汇编到sectionname的段,它的作用类似于.text和.data,为已初始化段。段名sectionname在编译时仅前8个字符有效。

.usect“sectionname”,sizeinwords[,[blockingflag][,alignmentflag]]

定义未初始化命名段,汇编到sectionname的段,它的作用和使用类似于.bss,为未初始化段。

在行首可以有标号,以定义段的首地址。段名sectionname在编译时仅前8个字符有效。5.6.3引用其他文件和条件汇编

.include“filename”

将指定文件复制到当前位置,可以是程序、数据和符号定义等。在行首可以有标号,以定义段的首地址。如:

COFF_START:.include″coff\\LPF.inc″

//在当前文件夹的coff子文件夹中

.if、.elseif、.else、endif

条件编译,汇编器根据表达式的真假情况进行编译。

.end

结束汇编,编译器忽略.end后面的代码。5.6.4宏定义和宏引用

如果在程序当中需要多次执行某段程序的一个简短的程序代码时,可以把这段程序定义为宏,然后在需要时调用,以提高编程效率和执行效率。

宏定义如下:

macname.macro[parameter1][,parameter2,…]…

[.mexit]

.endm[HT5]

其中,macname为宏名,放在行首,.mexit为宏退出,可选项,.endm为结束宏定义。.mexit类似于C语言中的goto语句,其后面的代码不执行,直接跳转到.endm处。如宏add3的定义如下:

.text

add3.macro p1,p2,p3,p//p=p1+p2+p3

LDp1,A

ADDp2,A

ADDp3,A

STLA,p

.endm当执行

add3a1,b1,c1,d1//d1=a1+b1+c1,变量不能用a、b表示,以免与累加器A、B名相混淆时,汇编器执行如下代码:LD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论