第3章指令系统_第1页
第3章指令系统_第2页
第3章指令系统_第3页
第3章指令系统_第4页
第3章指令系统_第5页
已阅读5页,还剩205页未读 继续免费阅读

下载本文档

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

文档简介

第3章指令系统3.1数据寻址方式3.2TMS320C54x的指令系统3.1数据寻址方式3.1.1指令的表示方法

1.指令的基本形式与所有的微处理器助记符指令一样,TMS320C54x的助记符指令也是由操作符和操作数两部分组成的。在汇编前,操作符是用助记符表示的,指出指令应完成何种操作;操作数用来描述该指令的操作对象,它可以是数据本身,也可以是指出如何获取操作数的信息。助记符指令的基本形式为标号,操作符,操作数1,操作数2,操作数3其中,标号是可选项,操作数可以没有或有多个,其内容可以是立即数、寄存器、程序地址、数据地址、I/O地址等。TMS320C54x中源操作数一般在操作数1的位置,目的操作数则在操作数3的位置,指令执行结果存放到目的操作数单元中,源操作数不变。上述指令的执行结果是将立即数0FFH传送至累加器A中。这里的LD为操作符,#0FFH为操作数1,累加器A为操作数2。2.指令的数据类型

TMS320C54x寻址存储器有两种基本的数据形式:16位数和32位数。大多数指令能够寻址16位数,只有双精度和长字指令才能寻址32位数,如表3-1所示。表3-1寻址32位数的指令在对32位数寻址时,先处理高有效字,然后处理低有效字。如果寻址的第1个字处在偶地址,那么第2个字就处在下一个(较高的)地址;如果第1个字处在奇地址,那么第2个字就处在前一个(较低的)地址,如图3-1所示。在讨论寻址方式时,要用到一些缩写语,表3-2给出了部分缩写语的名称和含义。图3-132位字的存储顺序表3-2部分寻址方式缩写语3.1.2数据寻址方式

TMS320C54x数字信号处理器共有7种寻址方式,如表3-3所示。表3-3TMS320C54x的数据寻址方式1.立即寻址立即寻址就是在指令中已经包含有执行指令所需的操作数(一个固定的立即数)。立即寻址方式中的立即数有两种数值形式,数值的位数为3、5、8或9位时为短立即数;数值的位数为16位时是长立即数。立即数可以包含在单字节或双字节指令中,短立即数在单字节指令中,长立即数在双字节指令中。在一条指令中,立即数的形式是由所使用的指令的类型决定的。在立即寻址方式的指令中,在数字前面加一个“#”符号,表示此数为一个立即数,否则会误认为是一个地址。例如:用一个十六进制数80H加载累加器A,可以写成如下指令:

LD#80H,A 执行后,A=0080H

如果将立即数10H先左移4位后,再加载累加器A,可以写成如下指令:

LD#10H,4,A 执行后,A=00000100HLD#32768,B 执行后,B=FFFF8000H,状态寄存器ST1中的SXM位等于1,数据进入ALU之前进行符号扩展2.绝对寻址绝对寻址就是指令中包含要寻址的存储单元的16位地址,指令按照此地址进行数据寻址。这种寻址方式为双字指令,速度慢。绝对寻址有以下四种形式:(1)数据存储器地址单元(dmad)寻址:用程序标号或数据来确定指令中所需要的数据空间地址。其指令如下:

MVDKSmem,dmad

MVDMdmad,MMRMVKDdmad,Smem

MVMDMMR,dmad(2)程序存储器地址单元(pmad)寻址:用一个符号或一个具体的数来确定程序存储器中的地址。其指令如下:

FIRS Xmem,Ymem,pmad

MACD Smem,pmad,src

MACP Smem,pmad,src

MVDP Smem,pmad

MVPD pmad,Smem(3)端口地址(PA)寻址:用一个符号或一个常数来确定外部I/O端口地址。其指令如下:

PORTR PA,Smem

PORTW Smem,PA(4)*(lk)寻址:16位符号常数所指的数据存储单元(Smem)中的操作数。3.累加器寻址累加器寻址是以累加器内容作为一个地址来读取程序存储器中的数据的。有两条指令可以用累加器寻址:

READASmem;把累加器A所确定的程序存储单元中的内容传送到由Smem所指定的数据存储单元中

WRITASmem;将Smem所指定的数据存储单元中的一个数传送到累加器A确定的程序存储器单元中4.直接寻址直接寻址就是在指令中包含有数据存储器地址(dma)的低7位,用这7位作为偏移地址,并与基地址值(数据页面指针DP的9位或堆栈指针SP的16位)组成一个16位的数据存储器地址。直接寻址分为数据页指针直接寻址和堆栈指针直接寻址两种。这两种寻址方式可以在不改变DP或SP的情况下,随机地寻找128个存储单元中的任何一个单元地址。直接寻址的优点是访问方便快捷,每条指令只需要一个字。直接寻址的代码格式如下:当状态寄存器ST1中的CPL位等于0时,ST0中的DP值(9位地址)与指令中的7位地址一起形成16位数据存储器地址,如图3-2所示。图3-2以DP为基准的直接寻址因为DP值的范围是0~511,所以以DP为基准的直接寻址把存储器分成512页;又因为7位dma值的范围是0~127,所以每页有128个可访问的单元,也就是说,DP指向512页中的一页,dma就指向该页中的特定单元。DP值可以由LD指令装入,RESET指令将DP赋为0。DP不能通过上电进行初始化,必须在程序中对它进行初始化后,才能保证程序正常工作。当ST1中的CPL位等于1时,将指令中的7位地址与16位堆栈指针SP相加,形成16位的数据存储器地址,如图3-3所示。图3-3以SP为基准的直接寻址方式直接寻址的句法是利用一个符号“@”(加在变量的前面)或者一个常数来确定偏移地址值的。例如:(1)数据页指针直接寻址:x=01FFH,y=0200H。(2)堆栈指针直接寻址:SP=0010H。5.间接寻址在间接寻址中,64K字数据空间中的任意单元都可以通过一个辅助寄存器中的16位地址进行访问,同时可以预调整或修改辅助寄存器值,完成循环寻址和位码倒序寻址等特殊功能。TMS320C54x有8个16位辅助寄存器(AR0~AR7)、两个辅助寄存器算术运算单元(ARAU0和ARAU1),它们与8个辅助寄存器一起完成16位无符号数算术运算。间接寻址很灵活,它不仅能在单条指令中对存储器读/写一个16位操作数,而且还能在单条指令中读两个独立的数据存储单元,读/写两个顺序的数据存储单元,或者读一个数据存储单元的同时写另一个数据存储单元。1)单数据存储器操作数间接寻址单数据存储器操作数间接寻址指令的格式如下:2~0位:3位辅助寄存器域,它定义了寻址所使用的辅助寄存器。ARF由状态寄存器ST1中的兼容方式位CMPT来决定。

CMPT=0:标准方式。ARP始终设置为0,不能修改。

CMPT=1:兼容方式。表3-4列出了16种单数据存储器操作数的间接寻址功能及其说明。单操作数间接寻址的硬件框图如图3-4所示表3-4单数据存储器操作数的间接寻址类型图3-4单操作数间接寻址的硬件框图2)位码倒序寻址功能位码倒序寻址提高了执行速度,在FFT算法中,经常要用到位码倒序寻址功能。在这种寻址方式中,AR0存放的整数N是FFT点数的一半。一个辅助寄存器指向一个数据存放的物理单元,当使用位倒序寻址把AR0加到辅助寄存器中时,地址以位倒序的方式产生,即进位是从左向右,而不是通常的从右向左。

例如:AR0=00001010B,AR2=01100110B,如执行*AR2+0B寻址功能,也就是(01100110)+(0001010),结果AR2=01101101B。应注意,计算是采用从左到右运算的。以16点FFT为例,其运算结果的顺序为X(0)、X(8)、X(4)、…、X(15),如表3-5所示。表3-5位码倒序寻址存储单元地址FFT变换结果位码倒序位码倒序寻址结果存储单元地址FFT变换结果位码倒序位码倒序寻址结果0000X(0)0000X(0)1000X(1)0001X(8)0001X(8)1000X(1)1001X(9)1001X(9)0010X(4)0100X(2)1010X(5)0101X(10)0011X(12)1100X(3)1011X(13)1101X(11)0100X(2)0010X(4)1100X(3)0011X(12)0101X(10)1010X(5)1101X(11)1011X(13)0110X(6)0110X(6)1110X(7)0111X(14)0111X(14)1110X(7)1111X(15)1111X(15)3)循环寻址在卷积、相关和FIR滤波器等算法中,都需要在存储器中设置一个循环缓冲器,它是一个滑动窗口,保存着最新的一批数据。当新的数据到来时,缓冲器中最早的数据就会被新的数据覆盖。循环缓冲器实现的关键是循环寻址的实现。循环缓冲器大小寄存器(BK)的内容确定了循环缓冲器的大小。BK中的数值由指令“STM#lk,BK”设定。长度为R的缓冲器必须从N位地址的边界开始(即循环缓冲器基地址的N个最低有效位必须为0),N应满足2N>R的最小整数。循环缓冲区的有效基地址(EFB)就是用户选定的辅助寄存器(ARx)的低N位置0后所得到的值,循环缓冲区的的尾地址(EOB)是通过用BK的低N位代替ARx的低N位得到的。循环缓冲区的指针index就是ARx的低N位,step就是加到辅助寄存器或从辅助寄存器中减去的值。图3-5说明了BK、辅助寄存器(ARx)、循环缓冲区的尾地址和首地址以及循环缓冲器的指针关系。图3-5循环寻址的框图循环寻址的算法为if0≤index+step≤BK;index=index+step.elseifindex+step≥BK;index=index+step-BK.elseifindex+step<0;index=index+step+BK.4)双数据存储器操作数寻址双数据存储器操作数寻址用来完成两个读操作,或一个读和一个并行存储操作。采用这种方式的指令只有一个长字,并且只能以间接寻址的方式工作。用Xmem和Ymem来代表这两个数据存储器操作数。在完成两个读操作过程中,Xmem表示读操作数(访问D数据总线),Ymem表示读操作数(访问C数据总线);在一个读操作同时并行一个并行存储操作过程中,Xmem表示读操作数(访问D数据总线),Ymem表示一个写(访问E数据总线)操作数。如果源操作数和目的操作数指向同一个单元,则在并行存储指令中(如ST||LD),读在写之前。如果一个双操作指令(如ADD)指向同一辅助寄存器,并且这两个操作数的寻址方式不同,那么就按Xmod域所确定的方式来寻址。双数据存储器操作数间接寻址的硬件框图如图3-6所示。图3-6双数据存储器操作数间接寻址的硬件框图双数据存储器操作数间接寻址的指令格式如下:15 8  76 54 32 1 0操作码XmodXarYmodYar表3-6双数据存储器操作数间接寻址指令代码的位说明位名称功能15~8操作码这8位包含了指令的操作码7~6Xmod访问Xmem操作数的间接寻址方式的类型5~4Xar标明包含Xmem地址的辅助寄存器3~2Ymod访问Ymem操作数的间接寻址方式的类型1~0Yar标明包含Ymem地址的辅助寄存器表3-7由指令的Xar和Yar域选择的辅助寄存器Xar或Yar域辅助寄存器00AR201AR310AR411AR5

表3-8双数据存储器操作数间接寻址类型Xmod或Ymod域操作数语法功能描述00*ARxaddr=ARxARx是数据存储器地址01*ARx−addr=ARxARx=ARx−1访问后,ARx中的地址减110*ARx+addr=ARxARx=ARx+1访问后,ARx中的地址加111*ARx+0%addr=ARxARx=circ(ARx+AR0)访问后,AR0以循环寻址的方式加到ARx中6.存储器映像寄存器寻址存储器映像寄存器寻址是用来修改存储器映像寄存器的,但不影响当前数据页指针DP或堆栈指针SP的值。由于DP和SP不需要改变,因此写一个寄存器的开销是最小的。存储器映像寄存器寻址可以在直接寻址和间接寻址中使用。存储器映像寄存器(MMR)地址的产生有两种方法:(1)在直接寻址方式下,不管当前DP或SP的值为何值,使数据寄存器地址的高9位(MSBs)强制置0,数据存储器地址的低7位(LSBs)则来自于指令字。(2)在间接寻址方式下,只使用当前辅助寄存器的低7位作为数据存储器地址的低7位,地址的高9位为0,指定的辅助寄存器的高9位在寻址后被强制置0。图3-7存储器映像寄存器寻址7.堆栈寻址系统堆栈用来在中断或调用子程序期间自动存放程序计数器,也能用来存放用户当前的程序环境或传递数据值。处理器使用一个16位存储器映像寄存器的一个堆栈指针(SP)来寻址堆栈,SP始终指向存放在堆栈中的最后一个单元。当调用一个子程序或一个中断响应发生时,PC会被自动压栈,堆栈指针SP指向存放最后一个数据的堆栈单元;返回时,返回地址从堆栈中弹出并装入PC。使用堆栈寻址方式访问堆栈的指令共有4条:

PSHD:把一个数据存储器的值压入堆栈。

PSHM:把一个存储器映像寄存器的值压入堆栈。

POPD:把一个数据存储器的值弹出堆栈。

POPM:把一个存储器映像寄存器的值弹出堆栈。堆栈存放数据是从高地址向低地址进行的。压入堆栈时,先减小SP,再将数据压入堆栈;弹出堆栈时,先从堆栈弹出数据,再增加SP值。图3-8说明了堆栈操作对堆栈指针(SP)的影响。图3-8堆栈操作对堆栈指针的影响3.2TMS320C54x的指令系统

TMS320C54x可以使用两套指令系统:代数表达式形式指令和助记符形式指令。代数表达式形式指令易学易记,运算关系清楚明了;助记符形式指令与计算机汇编语言比较接近,便于阅读和记忆。因为两者的汇编器不同,所以两种形式的指令不能混淆。TMS320C54x指令系统按功能可以分成四种基本类型:●算术运算指令;●逻辑运算指令;●程序控制指令;●加载和存储指令。3.2.1指令系统概述1.指令系统中规定的符号与缩写

TMS320C54x指令系统中规定了许多符号与缩写,在介绍指令系统之前应有所了解。为了便于学习和使用,在表3-9(略)和表3-10(略)中列出了指令系统和操作码中的符号和缩写,以备查用。2.指令系统中的记号和运算符指令系统中所用的一些记号见表3-11(略)。指令系统中所用的运算符号见表3-12。表3-12指令系统中所用的运算符号符号运算求值顺序+、-、~一元加法、减法、1的补码从右到左*、/、%乘法、除法、取模从左到右+、-加法、减法从左到右<<、>>左移、右移从左到右<、≤小于、小于或等于从左到右>、≥大于、大于或等于从左到右≠或!=不等于从左到右&按位与运算从左到右^按位异或运算从左到右|按位或运算从左到右3.2.2指令系统分类

TMS320C54x的指令一共有129条,由于操作数的寻址方式不同,以至于派生有205条指令。TMS320C54x指令系统的分类有两种方法,一是按指令执行时所需的周期分类;一是按指令的功能分类。按指令的功能可分为四类:算术运算指令、逻辑运算指令、程序控制指令以及加载和存储指令。1.算术运算指令算术运算指令用于完成加、减、乘、除等算术运算,可分为加法指令、减法指令、乘法指令、乘加指令、乘减指令、双操作数指令和专用指令。其中,大部分指令只需要一个指令周期,只有个别指令需要2~3个指令周期。1)加法指令指令中表示整数时,有有符号数和无符号数两种格式。TMS320C54x提供了多条用于加法的指令,如ADD、ADDC、ADDM和ADDS,具体说明见表3-13。表3-13加法指令的说明操作符操作数代数表达式注释ADDSmem,srcsrc=src+Smem操作数加到累加器ADDSmem,TS,srcsrc=src+Smem<<TS操作数移位后加到累加器ADDSmem,16,src[,dst]dst=src+Smem<<16操作数左移16位后加到累加器ADDSmem[,SHIFT],src[,dst]dst=src+Smem<<SHIFT操作数移位后加到累加器ADDXmem,SHFT,srcsrc=src+Xmem<<SHFT操作数移位后加到累加器ADDXmem,Ymem,dstdst=Xmem<<16+Ymem<<16两个操作数分别左移16位,然后相加

ADD#lk[,SHFT],src[,dst]dst=src+#lk<<SHFT长立即数移位后加到累加器ADD#lk,16,src[,dst]dst=src+#lk<<16长立即数左移16位后加到累加器ADDsrc[,SHIFT][,dst]dst=dst+src<<SHIFT累加器移位后相加ADDsrc,ASM[,dst]dst=dst+src<<ASM累加器按ASM移位后相加ADDCSmem,srcsrc=src+Smem+C操作数带进位加至累加器ADDM#lk,SmemSmem=Smem+#lk长立即数加至存储器中ADDSSmem,srcsrc=src+uns(Smem)符号位不扩展的加法

ADD指令有10种句法。如果目的累加器dst被指定,则结果存放在dst中;如果没有被指定,则结果存放在源累加器src中。移位操作数的范围为?16≤SHIFT≤15,0≤SHFT≤15。正数为左移位,左移位低位添0,高位受SXM位影响。如果SXM=1,则高位进行符号扩展;如果SXM=0,则高位清零。负数为右移位,受SXM位影响。如果SXM=1,则高位进行符号扩展;如果SXM=0,则高位清零。【例1】ADD*AR3+,14,A

指令执行前

指令执行后A0000001200HA0005401200HC1C0AR30100HAR30101HSXM1SXM1数据存储器

0100H1500H0100H1500H【例2】ADDA,-8,B

指令执行前

指令执行后A0005401200HA0005401200HB0000001800HB0000055812HC1C0【例3】ADD#4568H,8,A,B

指令执行前

指令执行后A0000001200HA0000001200HB0000001800HB0000457A00HC1C0【例4】ADD*AR2+,*AR2-,A

指令执行前

指令执行后A0000001200HA0028000000HC1C0AR20100HAR20101H数据存储器

00FFH1300H00FFH1300H0100H1400H0100H1400H0101H1500H0101H1500H【例5】ADDC*+AR2(5),A;不受SXM位影响

指令执行前

指令执行后A0000000030HA0000000045HC1C0AR20100HAR20105H数据存储器

0100H0000H0100H0000H0105H0014H0105H0014H【例6】ADDM#123BH,*AR4+;该指令不能循环执行

指令执行前

指令执行后AR40100HAR40101H数据存储器

0100H0014H0100H124FH【例7】ADDM#0F088H,*AR2+

指令执行前

指令执行后VOM1VOM1SXM1SXM1AR20105HAR20106H数据存储器

0105H8007H0105H8000H

【例8】ADDS*AR2-,B;无论SXM为何值,都不进行符号扩展

指令执行前

指令执行后B0000000003HB000000F004HCxC0AR20106HAR20105H数据存储器

0106HF001H0106HF001H2)减法指令

TMS320C54x中减法指令有许多,如SUB、SUBB、SUBC和SUBS,具体说明见表3-14。其中,SUBS是无符号数的减法运算,SUBB是带借位的减法运算,而SUBC是含条件的移位减。在TMS320C54x中,没有专门的除法指令,要实现除法运算一般有两种方法:一种方法是用乘法进行,如要除以某个数,可以先求出该数的倒数,再乘以其倒数;另一种方法是用SUBC指令,再重复16次减法运算,可实现两个无符号数的除法运算。减法指令中状态位与加法指令中的基本相同。表3-14减法指令的说明操作符操作数代数表达式注释SUBSmem,srcsrc=src-Smem从累加器中减去一个操作数SUBSmem,TS,srcsrc=src-Smem<<TS从累加器中减去移位后的操作数SUBSmem,16,src[,dst]dst=src-Smem<<16从累加器中减去左移16位后的操作数SUBSmem[, SHIFT], src[,dst]dst=src-Smem<<SHIFT操作数移位后与累加器相减

操作符操作数代数表达式注释SUBXmem,SHFT,srcsrc=src-Xmem<<SHFT操作数移位后与累加器相减SUBXmem,Ymem,dstdst=Xmem<<16-Ymem<<16两个操作数分别左移16位再相减SUB#lk[,SHFT],src[,dst]dst=src-#lk<<SHFT长立即数移位后与累加器相减SUB#lk,16,src[,dst]dst=src-#lk<<16长立即数左移16位后与累加器相减SUBsrc[,SHIFT][,dst]dst=dst-src<<SHIFT源累加器移位后与目的累加器相减SUBsrc,ASM[,dst]dst=dst-src<<ASM源累加器按ASM移位后与目的累加器相减SUBBSmem,srcsrc=src-Smem-带借位的减法SUBCSmem,srcif(src-Smem<<15)≥0src=(src-Smem<<15)<<1+1elsesrc=src<<1有条件减法SUBSSmem,srcsrc=src-uns(Smem)符号位不扩展的减法【例9】SUB#12345,8,A,B

指令执行前

指令执行后A0000001200HA0000001200HB0000001800HBFFFFCFD900HCXC0SXM1SXM1

【例10】LD#8,DP ;使页面指针DP=8 LD#0006H,A ;加载A累加器

SSBXC ;置借位位C为1

SUBB@5,A ;完成带借位的减法运算。数据地址=0405H,为直接寻址

指令执行前

指令执行后A0000000006HAFFFFFFFFFEHC1C0DP008HDP008H数据存储器

0405H0008H0405H0008H【例11】利用SUBC完成整除法,41H÷7H=9H,余数是2H。LD #0041H,B ;将被除数41H装入累加器B的低16位

STM #0100H,AR2 ;寄存器AR2=0100HSTM #0110H,AR3 ;寄存器AR3=0110HST #0007H,*AR2 ;设置AR2寄存器的内容,(AR2)=0007HRPT #15 ;重复SUBC指令15+1次

SUBC*AR2,B;使用SUBC指令完成除法运算

STLB,*AR3+;将商(累加器B的低16位)存入变量AR3所指地址的数据单元,AR3+1→AR3STHB,*AR3;将余数(累加器B的高16位)存入变量AR3所指地址的数据单元

SUBC指令重复执行前和最后一条指令执行完后各寄存器的状态如下:

指令执行前

指令执行后B0000000041HB0000020009HCXC1AR20100HAR20100HAR30110HAR30111H数据存储器

0100H0007H0100H0007H0110H0000H0110H0009H0111H0000H0111H0002H【例12】商为整数的除法:0.44÷(-0.22)=-2的程序段。 .bss num,1 .bss den,1 .bss quot,1 .datatable: .word 44*32768/100 .word -22*32768/100 .textstart: STM #num,AR1 ;把被除数的地址送入AR1中

RPT #1 ;把下一条指令重复执行2次

MVPD table,*AR1+ ;把被除数和除数送进数据存储单元

LD @den,16,A;将除数装入A累加器的高16位

MPYA @num ;利用乘法操作确定商的符号

ABS A ;将除数取绝对值

STH A,@den ;将除数绝对值放回原位

LD @num,A ;将被除数装入A累加器的低16位

ABS A ;将被除数取绝对值

RPT #15 ;16次减法循环,完成除法

SUBC @den,A XC 1,BLT ;如果B<0,则商为负数,执行NEG指令,否则跳;过NEG指令

NEG A STL A,@quot;保存结果done: B done .end结果y=FFFEH=-2。【例13】商为小数的除法:44÷(-176)=-0.25的程序段。 .bss num,1 .bss den,1 .bss quot,1 .datatable: .word 44 .word -176 .textstart: STM

#num,AR1 RPT

#1 MVPD table,*AR1+ LD @den,16,A MPYA @num ABS A STH A,@den LD @num,16,A ;将被除数装入A累加器的高16位

ABS A RPT #14;15次减法循环,完成除法

SUBC@den,A XC 1,BLT NEG A STL A,@quotdone: B done .end结果y=E000H=-0.25。3)乘法指令

TMS320C54x中有大量的乘法运算指令,其结果都是32位,放在A或B累加器中,如表3-15所示。乘数在TMS320C54x的乘法指令中的使用很灵活,可以是T寄存器、立即数、存储单元以及A或B累加器的高16位。如果是无符号数相乘,则使用一条专用于无符号数相乘的指令,即MPYU指令,其他指令都是有符号数的乘法。表3-15乘法指令的说明操作符操

数代数表达式注

释MPYSmem,dstdst=T×SmemT寄存器值与操作数相乘MPYRSmem,dstdst=rnd(T×Smem)T寄存器值与操作数相乘(带舍入)MPYXmem,Ymem,dstdst=Xmem×Ymem,T=Xmem两个操作数相乘MPYSmem,#lk,dstdst=Smem×#lk,T=Smem长立即数与操作数相乘MPY#lk,dstdst=T×#lkT寄存器值与长立即数相乘MPYAdstdst=T×AT寄存器值与累加器A的高位相乘MPYASmemB=Smem×A,T=Smem操作数与累加器A的高位相乘MPYUSmem,dstdst=uns(T)×uns(Smem)两无符号数相乘SQURSmem,dstdst=SmemvSmem,T=Smem操作数的平方SQURA,dstdst=A×A累加器A的高位平方【例14】实现整数乘法。LD #0030H,A ;将0030H装入累加器ASTM #0100H,AR2 ;AR2=0100HST #2000H,*AR2 ;(AR2)=2000HRSBX FRCT ;清FTCT标志位,准备整数乘LD #2,DP ;DP=002HLD 0,T ;将AR2中的内容2000H装入T寄存器MPY #-2,A ;完成2000H与0FFFEH相乘,结果放入A累加器(32位),;A=FFFFFFC000H【例15】实现小数乘法。

SSBX FRCT ;置FRCT标志位,准备小数乘法

LD temp1,16,A;将变量temp1装入累加器A的高16位MPYA temp2

;完成temp2与累加器A的高16位相乘,结果放入B累加器,;并将temp2装入T寄存器STH temp3;将乘积结果的高16位存入变量temp34)乘加指令乘加指令完成一个乘法运算,将乘积再与源累加器的内容相加。指令中使用R后缀的,其运算结果要进行凑整。表3-16是对乘加指令的说明。表3-16乘加指令的说明操作符操

数代数表达式注

释MACSmem,srcsrc=src+T×SmemT寄存器值与操作数相乘后加到累加器MACXmem,Ymem,src[,dst]dst=src+Xmem×Ymem,T=Xmem两个操作数相乘后加到累加器MAC#lk,src[,dst]dst=src+T×#lk长立即数与T寄存器值相乘后加到累加器MACSmem,#lk,src[,dst]dst=src+Smem×#lk,T=Smem长立即数与操作数相乘后加到累加器MACRSmem,srcsrc=rnd(src+T×Smem)T寄存器值与操作数相乘后加到A(带舍入)MACRXmem,Ymem,src[,dst]dst=rnd(src+Xmem×Ymem),T=Xmem两个操作数相乘后加到累加器(带舍入)MACASmem[,B]B=B+Smem×A,T=Smem操作数与累加器A的高位相乘后加BMACAT,src[,dst]dst=src+T×AT与A的高位相乘后再累加MACARSmem[,B]B=rnd(B+Smem×A)T=Smem操作数与A的高位相乘后再加B(带舍入)MACART,src[,dst]dst=rnd(src+T×A)T与A的高位相乘后再累加MACDSmem,pmad,srcsrc=src+Smem×pmad,T=Xmem,Smem=Smem+1带延时的操作数与程序存储器值相乘后再累加MACPSmem,pmad,srcsrc=src+Smem×pmad,T=Xmem操作数与程序存储器值相乘后再累加MACSUSmem,Ymem,srcsrc=src+uns(Smem)×Ymem,T=Xmem无符号数与有符号数相乘后再累加【例16】MAC#345H,A,B

指令执行前

指令执行后A0000001000HA0000001000HB0000000000HB00000D2400HT0400HT0400HFRCT0FRCT0【例17】MAC#345H,A,B

指令执行前

指令执行后A0000001000HA0000001000HB0000000000HB00001A3800HT0400HT0400HFRCT1FRCT1【例18】MAC*AR3+,*AR4+,A,B

指令执行前

指令执行后A0000001000HA0000001000HB0000000004HB000C4C10C0HT0008HT5678HFRCT1FRCT1AR30100HAR30101HAR40200HAR40201H数据存储器

0100H5678H0100H5678H0200H1234H0200H1234H【例19】MACR*AR3+,*AR4+,A,B

指令执行前

指令执行后A0000001000HA0000001000HB0000000004HB000C4C0000HT0008HT5678HFRCT1FRCT1AR30100HAR30101HAR40200HAR40201H数据存储器

0100H5678H0100H5678H0200H1234H0200H1234H【例20】MACAT,A,B

指令执行前

指令执行后A0012340000HA0012340000HB0000020000HB0012CF4BA0HT0444HT0444HFRCT1FRCT1【例21】MACAT,B,B

指令执行前

指令执行后A0012340000HA0012340000HB0000020000HB00009D4BA0HT0444HT0444HFRCT1FRCT1【例22】MACD*AR2-,COEFFS,A

指令执行前

指令执行后A0000770000HA00007D0B44HT0008HT0055HFRCT0FRCT0AR20100HAR200FFH程序存储器

COEFFS1234HCOEFFS1234H数据存储器

0100H0055H0100H0055H0101H0066H0101H0055H【例23】MACSU*AR3+,*AR4+,A

指令执行前

指令执行后A0000001000HA0009A0AA84HT0008HT8765HFRCT0FRCT0AR30100HAR30101HAR40200HAR40201H数据存储器

0100H8765H0100H8765H0200H1234H0200H1234H

【例24】MACSU*AR3+,*AR4+,A

指令执行前

指令执行后A0000001000HAFFF76CAA84HT0008HT1234HFRCT0FRCT0AR30100HAR30101HAR40200HAR40201H数据存储器

0100H1234H0100H1234H0200HFFFF8765H0200H8765H5)乘减指令乘减指令完成从累加器B或源累加器src或目的累加器dst中减去T寄存器或一个操作数与另一个操作数的乘积,结果存放在累加器B或dst或src中。表3-17是对乘减指令的说明。

表3-17乘减指令的说明操作符操作数代数表达式注释MASSmem,srcsrc=src−T×Smem从src中减去T与操作数的乘积MASRSmem,srcsrc=uns(src−T×Smem)从src中减去T与操作数的乘积(带舍入)MASXmem,Ymem,src[,dst]dst=src−Xmem×Ymem,T=Xmem从src中减去两操作数的乘积MASRXmem,Ymem,src[,dst]dst=rnd(src−Xmem×Ymem),T=Xmem从src中减去两操作数的乘积(带舍入)MASASmem[,B]B=B−Smem×A,T=Smem从B中减去操作数与A高位的乘积MASAT,src[,dst]dst=src−T×A从src中减去T与A高位的乘积MASART,src[,dst]dst=rnd(src−T×A)从src中减去T与A高位的乘积(带舍入)SQURASmem,srcsrc=src+Smem×Smem,T=Smem平方后累加SQURSSmem,srcsrc=src−Smem×Smem,T=Smem平方后作减法【例25】MAS*AR3+,*AR4+,A,B

指令执行前

指令执行后A0000001000HA0000001000HB0000000004HBFFF3B40F40HT0008HT5678HFRCT1FRCT1AR30100HAR30101HAR40200HAR40201H数据存储器

0100H5678H0100H5678H0200H1234H0200H1234H【例26】MASRAR3+,*AR4+,A,B

指令执行前

指令执行后A0000001000HA0000001000HB0000000004HBFFF3B40000HT0008HT5678HFRCT1FRCT1AR30100HAR30101HAR40200HAR40201H数据存储器

0100H5678H0100H5678H0200H1234H0200H1234H【例27】编制计算

y=0.1*0.8+(-0.2)*0.6+(-0.3)*(-0.9)程序段。.bss x,3 .bss a,3 .bss y,1 .datatable: .word 1*32768/10,-2*32768/10,-3*32768/10 .word 8*32768/10,6*32768/10,-9*32768/10 .textstart: STM #table,AR1;AR1指向程序地址table STM #x,AR2;AR2指向x STM #5,AR0 LD #0,A loop: LD *AR1+,A ;从程序存储单元向数据存储单元传送6个数据

STL A,*AR2+

BANZloop,*AR0-

;AR0≠0,执行标号loop,否则执行下一条指令

SSBX FRCT CALL SUMend: B endSUM: STM #a,AR3 ;被乘数单元

STM #x,AR4 ;乘数单元

RPTZ A,#2 ;重复执行下条指令3次,使累加器A清零

MAC *AR3+,*AR4+,A STH A,@y RET .end结果y=1D70H=0.23。6)双操作数指令双操作数指令中有一个操作数Lmem是长数据存储操作数,该指令为双长字(32位)的指令。如DADD指令,它在C16的控制下完成一个32位的加法运算或两个16位的加法运算。当C16=0时,指令以双精度(32位)方式执行;当C16=1时,指令以双16位方式执行。表3-18是对双操作数指令的说明。表3-18双操作数指令的说明操作符操作数代数表达式注释DADDLmem,src,[dst]ifC16=0dst=Lmem+srcIfC16=1

dst(39~16)=Lmem(31~16)+src(31~16)dst(15~0)=Lmem(15~0)+src(15~0)双精度/双16位数加到累加器DADSTLmem,dstifC16=0dst=Lmem+(T<<16+T)ifC16=1dst(39~16)=Lmem(31~16)+Tdst(15~0)=Lmem(15~0)-T双精度/双16位数与T寄存器值相加/减DRSUBLmem,srcifC16=0dst=Lmem-src

ifC16=1

src(39~16)=Lmem(31~16)-src(31~16)src(15~0)=Lmem(15~0)-src(15~0)双精度/双16位数减去累加器DSADTLmem,dstifC16=0dst=Lmem-(T<<16+T)ifC16=1dst(39~16)=Lmem(31~16)-Tdst(15~0)=Lmem(15~0)+T长立即数与T寄存器值相加/减DSUBLmem,srcifC16=0src=src-Lmem

ifC16=1

src(39~16)=src(31~16)-Lmem(31~16)

src(15~0)=src(15~0)-Lmem(15~0)从累加器中减去双精度/双16位数DSUBTLmem,srcifC16=0dst=Lmem-(T<<16+T)ifC16=1dst(39~16)=Lmem(31~16)-Tdst(15~0)=Lmem(15~0)-T从长立即数中减去T寄存器值【例28】DADD*AR3+,A,B

指令执行前

指令执行后A0056788933HA0056788933HB0000000000HB006BAD1D89HAR30100HAR30102HC160C160数据存储器

0100H1534H0100H1534H0101H9456H0101H9456H【例29】DADD*AR3-,A,B

指令执行前

指令执行后A0056788933HA0056788933HB0000000000HB006BAC1D89HAR30100HAR300FEHC161C161数据存储器

0100H1534H0100H1534H0101H9456H0101H9456H7)专用指令在TMS320C54x中,许多专用指令用来完成一些特殊的操作,这样不仅可以大大提高编写程序的速度,缩短程序的长度,还避免了汇编中为实现一种功能而需要多条语句的弊端,减少了指令执行的周期。表3-19是对专用指令的说明。表3-19专用指令的说明操作符操作数代数表达式注释ABDSTXmem,YmemB=B+∣A(32~16)∣A=(Xmem-Ymem)<<16求绝对值ABSsrc,[dst]dst=∣src∣累加器取绝对值CMPLsrc,[dst]dst=累加器取反DELAYSmem(Smem+1)=Smem存储器单元延迟EXPsrcT=符号位所在的位数(src)-8求累加器的指数FIRSXmem,Ymem,pmadB=B+A(32~16)

pmad

A=(Xmem+Ymem)<<16对称有限冲击响应滤波器LMSXmem,YmemB=B+Xmem

YmemA=A+Xmem<<16+215求最小均方值操作符操

数代数表达式注

释MAXdstdst=max(A,B)求累加器的最大值MINdstdst=min(A,B)求累加器的最小值NEGsrc,[dst]dst=-src累加器变负NORMsrc,[dst]dst=src<<TSdst=norm(src,TS)归一化POLYSmemB=Smem<<16A=rnd(A(32~16)

T+B)求多项式的值RNDsrc,[dst]dst=src+215累加器舍入运算SATsrc饱和运算(src)对累加器的值做饱和计算SQDSTXmem,YmemB=B+A(32~16)×A(32~16)A=(Xmem-Ymem)<<16求两点之间距离的平方【例30】ABDST*AR3+,*AR4+

指令执行前

指令执行后AFFABCD0000HAFFFFAB0000HB0000000000HB0000005433HAR30100HAR30101HAR40200HAR40201HFRCT0FRCT0数据存储器

0100H0055H0100H0055H0200H00AAH0200H00AAH【例31】FIRS*AR3+,*AR4+,COEFFS

指令执行前

指令执行后A0000770000HA0000FF0000HB0000000000HB000008762CHAR30100HAR30101HAR40200HAR40201HFRCT0FRCT0数据存储器

0100H0055H0100H0055H0200H00AAH0200H00AAH程序存储器

COEFFS1234HCOEFFS1234H2.逻辑指令按照功能的不同可将逻辑指令分为五组,即与指令(AND)、或指令(OR)、异或指令(XOR)、移位指令(ROL)和测试指令(BITF)。根据操作数的不同,指令的执行需要1~2个指令周期。前三组指令与计算机汇编语言中逻辑指令一样,是按位进行操作的。1)与逻辑运算指令表3-20是对与逻辑运算指令的说明。表3-20与逻辑运算指令的说明操作符操作数代数表达式注释ANDSmem,srcsrc=src&Smem操作数和累加器相与AND#lk[,SHFT],src[,dst]dst=src&#lk<<SHIFT长立即数移位后和累加器相与AND#lk,16,src[,dst]dst=src&#lk<<16长立即数左移16位后和累加器相与ANDsrc[,SHIFT][,dst]dst=dst&src<<SHIFT源累加器移位后和目的累加器相与ANDM#lk,SmemSmem=Smem&#lk操作数和长立即数相与2)或逻辑运算指令表3-21是对或逻辑运算指令的说明。表3-21或逻辑运算指令的说明操作符操作数代数表达式注释ORSmem,srcsrc=src∣Smem操作数和累加器相或OR#lk[,SHFT],src[,dst]dst=src∣#lk<<SHFT长立即数移位后和累加器相或OR#lk,16,src[,dst]dst=src∣#lk<<16长立即数左移16位后和累加器相或ORsrc[,SHIFT][,dst]dst=dst∣src<<SHIFT源累加器移位后和目的累加器相或ORM#lk,SmemSmem=Smem∣#lk操作数和长立即数相或3)异或逻辑运算指令表3-22是对异或逻辑运算指令的说明。表3-22异或逻辑运算指令的说明操作符操作数代数表达式注释XORSmem,srcsrc=src∧Smem操作数和累加器相异或XOR#lk[,SHFT],src[,dst]dst=src∧#lk<<SHFT长立即数移位后和累加器相异或XOR#lk,16,src[,dst]dst=src∧#lk<<16长立即数左移16位后和累加器相异或XORsrc[,SHIFT][,dst]dst=dst∧src<<SHIFT源累加器移位后和目的累加器相异或XORM#lk,SmemSmem=Smem∧#lk操作数和长立即数相异或4)移位指令表3-23(略)是对移位指令的说明。【例32】SFTAA,-8,B

指令执行前

指令执行后AFF87650055HAFF87650055HB0043211234HBFFFF876500HCXC0SXM1SXM1

【例33】SFTAA,-8,B

指令执行前

指令执行后AFF87650055HAFF87650055HB0043211234HB00FF876500HCXC0SXM0SXM0OVM0OVM0OVB0OVB1【例34】SFTLA,-8,B

指令执行前

指令执行后AFF87650085HAFF87650085HBFF80000000HB0000876500HC0C1【例35】SFTLB,+5

指令执行前

指令执行后BFFA2001234HB0040024680HC0C05)测试指令测试指令可以测试操作数的指定位的值,也可以比较两个操作数是否相等。这些指令的执行需要1~2个指令周期。表3-24是对测试指令的说明。表3-24测试指令的说明操作符操作数代数表达式注释BITXmem,BITCTC=Xmem(15−BITC)测试指定位BITFSmem,#lkIf(Smem&&#lk)=0thenTC=0ElseTC=1测试由立即数指定的位域BITTSmemTC=Smem(15−T(3~0))测试由T寄存器指定的位CMPMSmem,#lkIfSmem=#lkthenTC=1ElseTC=0比较单数据存储器操作数和立即数的值CMPRCC,ARx0≤CC≤3CC=00,测试ARx=AR0CC=01,测试ARx<AR0CC=10,测试ARx>AR0CC=11,测试ARx≠AR0If(cond)thenTC=1ElseTC=0辅助寄存器ARx与AR0相比较【例36】BIT*AR2+,12

指令执行前

指令执行后TCXTC1AR20100HAR20101H数据存储器

0100H7688H0100H7688H【例37】CMPR2,AR4

指令执行前

指令执行后TC1TC0AR0FFFFHAR0FFFFHAR47FFFHAR47FFFH3.程序控制指令程序控制指令用于控制程序的执行顺序。程序控制指令包括分支转移指令(B、BC)、调用指令(CALL)、中断指令(INTR、TRAP)、返回指令(RET)、重复指令(RPT)、堆栈操作指令(FRAME、POPD)和混合程序控制指令(IDLE、NOP)。这些指令根据不同情况分别需要1~6个指令周期。条件分支转移指令或条件调用、条件返回指令都要用条件来限制分支转移、调用和返回操作,只有当一个条件或多个条件得到满足时才执行指令。条件运算符分为两组,如表3-25所示。表3-25条件运算符第1组第2组说明A类B类A类B类C类l

组内同一类中不能选两个条件l

组内类与类之间的条件可以“与/或”l

组与组之间的条件只能“或”l

组1的不同类组合时,必须针对同一累加器EQ、NEQLEQ、GEQLT、GTOVNOVTCNTCCNCBIONBIO

1)分支转移指令

温馨提示

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

评论

0/150

提交评论