1第5章TMS320C54XDSP指令系统2’c54x共有l29条指令,由不同的寻址方式可衍生至216条。按指令功能分为如下五类:1、装载存储类指令(LoadandStore)2、算术运算类指令(Arithmetic)3、逻辑运算类指令(Logical)4、程序控制类指令(Program-control)5、单个循环类指令(Loop)31.装载存储类指令装载存储类指令即数据传送指令,其作用是把源操作数从源存储器中送到目的操作数指定的存储器里,用于完成数据的读入和保存。’c54x的数据传送指令包括装载指令、存储指令(含条件存储指令)、混合装载存储指令及并行装载存储、并行装载乘法、并行存储乘法、并行存储加/减等等。4装载指令(Load)可将存储器的内容或立即数赋给目的寄存器。共有21条装载类指令:56SXM是ST1中第8位,意思是符号位扩展方式7存储指令(Store)可将源累加器、立即数或临时寄存器等的值保存到数据存储单元或存储映射寄存器。存储指令共14条8T为暂存寄存器9BRC为块重复寄存器10混合装载-存储指令可实现程序/端口/数据-数据存储单元间的数据交换,以及两个存储映射寄存器间的数据交换(共12条)111213数据块移动指令MVDD、MVDP、MVPD在C54x系列DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如16个系数的移动:142.算术运算类指令’c54x的算术运算指令丰富,且运算能力强大。算术运算指令用于完成加减乘除等算术运算。按照功能可将算术运算类指令分为7组:(1)加法指令(Add)(2)减法指令(Subtract)(3)乘法指令(Multiply)(4)乘加指令(Multiply-accumulate)(5)乘减指令(Multiply-subtract)(6)双字指令(32比特操作数)(7)专用指令(Application-specific)15加法指令是将16比特的值与累加器的内容或另一个数据存储单元的内容相加,并把结果放进累加器。加法指令共有13条。16ADD中的寻址方式ADDSmem[,SHIFT],src[,dst]例如:ADD60H,-1,A,BADDXmem,SHFT,src例如:AR5,1,AADDXmem,Ymem,dst例如:ADD*AR2,*AR3,A17‘C54X中提供了多条用于加法的指令如ADD,ADDC,ADDM和ADDS。其中:ADDS用于无符号数的加法运算ADDC用于带进位的加法运算(如32位扩展精度加法)ADDM专用于立即数的加法。18(0100H)的内容左移14位与A相加,结果在A中19减法指令是将累加器内容或另一个数据存储单元内容与一个16比特值相减,并把结果放进累加器中(共13条)20‘C54X中提供了多条(13条)用于减法的指令,如SUB,SUBB,SUBC和SUBS。SUBS用于无符号数的减法运算SUBB用于带借位的减法运算(如32位扩展精度的减法)SUBC为条件移位减法运算,DSP中除法就是用该指令来实现的SUB指令与ADD指令一样,有许多的寻址方式。21减法指令使用举例stm#60h,ar2;将变量temp1的地址装入;ar2寄存器stm#61h,ar3;将变量temp2的地址装入;ar3寄存器sub*ar2+,*ar3,b;将变量temp2,temp1左移;16位后相减,结果放入寄;存器B(高16位)中,ar2加1sthb,63h;将相减的结果(高16位);存入temp3单元中22乘法指令是’c54x指令系统中最具特色的部分。可将临时寄存器T或一个数据存储单元的内容与一个立即数或另一个数据存储单元的内容相乘,并把结果放进目的累加器。乘法指令共有10条。2324实现16位定点整数乘法’C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在‘C54X的乘法指令很灵活,其操作数可以是T寄存器、立即数、存贮单元以及A寄存器的高16位。如果是无符号数乘时,可使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。25整数乘法举例rsbxFRCT;清FRCT标志,准备;整数乘ldtemp1,T;将变量temp1装入T;寄存器mpytemp2,a;完成temp2*temp1,;结果放入A寄存器(32位)26实现小数乘法在‘C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT(ST1),将其设置为1时,系统自动将乘积结果左移一位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。27小数乘法举例ssbxFRCT;FRCT=1,准备小数乘法ldtemp1,16,a;将变量temp1装入寄存器A;的高16位mpyatemp2;完成temp2乘寄存器A的;高16位结果在B中,同时,;将temp2装入T寄存器sthb,*AR3;将乘积结果的高16位存入;数据单元28乘加指令是将临时寄存器T或一个数据存储单元的内容与一个立即数或另一个数据存储单元的内容相乘并把乘积与源累加器的内容相加,然后把结果放进目的累加器中。293031乘减指令MAS,将临时寄存器T或一个数据存储单元的内容与另一个数据存储单元的内容相乘并把乘积与源累加器的内容相减,然后把结果放进累加器中。32(SXM=1)33双字指令是指那些有一个操作数为双字长(32比特)的指令。以DADD为例,它在C16的控制下完成一个32比特的加或两个16比特的加。34C16=0,双精度方式C16=1,双16位数方式35特殊功能专用指令363.逻辑运算类指令’c54x的逻辑运算类指令按照功能分为5组:(1)与指令(AND)(2)或指令(OR)(3)异或指令(XOR)(4)移位指令(SHIFT)(5)测试指令(TEST)37与指令(AND)3839或指令(OR)4041异或指令(XOR)4243移位指令(SHIFT)44测试指令(TEST)45条件代码表达式说明00EQ测试ARx是否等于AR001LT测试ARx是否小于AR010GT测试ARx是否大于AR011NEQ测试ARx是否等于AR0条件代码CC值说明4647484.程序控制类指令程序控制指令用于控制程序的流程,也就是指令的执行顺序。’c54x的程序控制类指令按照功能分为7组:(1)跳转指令(Branch)(2)调用指令(Call)(3)中断指令(Interrupt)(4)返回指令(Return)(5)重复指令(Repeat)(6)堆栈操作指令(7)其他程序控制指令49跳转指令可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。这种跳转可以是无条件的,也可以是有条件的;可以是无延迟的,也可以是带延迟的。5051调用指令同样可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。但与跳转指令不同的是,DSP在执行完被调用的程序段后要返回起跳处继续执行原来的程序。同样,这种调用也可以是无条件的或有条件的。5253中断指令同样可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。但与调用指令一样,DSP在执行完中断服务程序后要返回发生中断的地方继续执行原来的程序。当发生中断时,DSP会置INTM为1,屏蔽所有可屏蔽中断,并在中断标志寄存器IFR中设置相应的中断标志。54中断号中断名称中断地址功能说明优先级0RS/SINTR00H复位(硬件/软件)11NMI/SINTR04H不可屏蔽中断22SINT1708H软件中断#17—3SINT180CH软件中断#18—4SINT1910H软件中断#19—5SINT2014H软件中断#20—6SINT2118H软件中断#21—7SINT221CH软件中断#22—8SINT2320H软件中断#23—9SINT2424H软件中断#24—10SINT2528H软件中断#25—11SINT262CH软件中断#26—12SINT2730H软件中断#27—13SINT2834H软件中断#28—14SINT2938H软件中断#29—5515SINT303CH软件中断#30—16INT0/SINT040H外部中断0317INT1/SINT144H外部中断1418INT2/SINT248H外部中断2519TINT0/SINT34CH内部定时器0中断620BRINT0/SINT450H缓存串口0接收中断721BXINT0/SINT554H缓存串口0发送中断822DMAC0/SINT658HDMA通道0中断923TINT1/DMAC1/SINT75CH定时器1/DMA1中断1024INT3/SINT860H外部中断31125HINT/SINT964HHPI口中断1226BRINT1/DMAC2/SINT1068H缓存串口1接收/DMA2中断1327BXINT1/DMAC3/SINT116CH缓存串口1发送/DMA3中断1428DMAC4/SINT1270HDMA4中断1529DMAC5/SINT1374HDMA5中断1630-31—78-7F保留—5657返回指令用于在执行完被调用的程序段或中断服务程序后,返回到调用指令或发生中断的地方,使DSP能继续执行原来的程序5859重复指令可以使DSP重复执行一条指令或一段指令60RPT#K;单指令重复,RC=#K61堆栈操作指令可以对堆栈进行压入(PUSH)和弹出(POP)操作,相应的操作数可以是数据存储单元Smem或存储映射寄存器MMR。6263645.其他程序控制指令65常用的几条指令举例:1.MAC——乘积累加指令句法:MACSmem,src;MACXmem,Ymem,src;数据存储器单元Smem,Xmem,Ymem直接或间接寻址功能:src=src+T*Smemsrc=src+Xmem*Ymem,T=Xmem662.MACD句法:MACDSmem,pmad;功能:同前增加了:(Smem+1)=smem该指令类似于MAC指令,但对于片内RAM增加了数据移动1个单元的功能。该指令操作小结:a:将程序存储器地址装入PCb;将存于数据区的数据乘以程序区的数据PREGc:将乘积PREG累加到累加器ACCd;PC+1PC,指向下一个程序存储器单元。e:移动数据,将数据块中一个单元的数据向高地址移动1个地址单元。673.重复操作3条重复操作指令:RPT、RPTZ、RPTB(1)重复执行单条指令RPT(重复下条指令)RPTZ(累加器清0并重复下条指令)重复指令RPT或RPTZ允许重复执行紧随其后的那一条指令。重复执行n次,重复指令中应规定计数值为n-1。例对一个数组进行初始化:x[5]={0,0,0,0,0}。.bbsx,5;STM#x,AR1;AR1=x,x为x[5]的首地址LD#0,A;A=0RPT#4STLA,*AR1+68(2)块程序重复操作指令RPTB(块重复指令)块程序重复操作指令RPTB将重复操作的范围扩大到任意长度循环回路。69例:33221100300xaxaxaxaxayiii.mmregs.bssa,4.bssx,4.bssy,2.datatable.word1,2,3,4.word8,6,4,2.textSTM#a,AR1RPT#7MVPDtable,*AR1+STM#a,AR2STM#x,AR3RPTZA,#3MAC*AR2+,*AR3+,ALD#a,DPSTLA,@ySTHA,@y+1…..704.堆栈的使用方法进栈:先SP-1SP,再压入数据,出栈:先弹出数据,后SP+1SP。设置方法:size.set100stack.usect“STK”,sizeSTM#stack+size,SP5.循环操作:BANZBANZ(当辅助寄存器不为0时转移)71BANZ举例:4321040xxxxxxyii.mmregs.bssx,5.bssy,1.dat