您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第3章-DSP指令系统及特点
第三章DSP指令系统及特点第一节TMS320C54x的寻址方式(1)立即数寻址(2)绝对地址寻址(3)累加器寻址(4)直接寻址(5)间接寻址(6)存储器映射寄存器寻址(7)堆栈寻址寻址指令中用到的缩写符号及其含义缩写符号含义Smem16位单数据存储器操作数Xmem在双操作数指令及某些单操作数指令中所用的16位双数据存储器操作数,从DB总线上读出Ymem在双操作数指令中所用的16位双数据存储器操作数,从CB总线上读出;在读同时并行写的指令中表示写操作数dmad16位立即数——数据存储器地址(0~65535)pmad16位立即数——程序存储器地址(0~65535)PA16位立即数——I/O口地址(0~65535)src源累加器(A或B)dst目的累加器(A或B)lk16位长立即数1.立即数寻址LD#93h,A;把立即数93h送入累加器A指令中包含立即操作数。立即数分为短立即数(3、5、8或9位)和16位的长立即数。短立即数指令编码可以为一个字长,16位立即数的指令编码为两个字长。立即数寻址指令中在数字或符号常数前面加一个“#”号,来表示立即数。LD93h,A;把地址为93h单元中的数送入累加器A2.绝对地址寻址指令中包含所要寻址的存储单元的16位地址,这个16位地址可以是地址标号或16位符号常数。1)数据存储器(dmad)寻址2)程序存储器(pmad)寻址3)端口地址(PA)寻址4)长立即数*(lk)寻址数据存储器(dmad)寻址数据存储器寻址使用符号(符号地址)或一个表示16位地址的立即数来指明寻址的数据存储单元的16位绝对地址。例如:MVKDSMAPLE,*AR3;把SAMPLE标注的数据空间地址里的数复制到AR3所指定的数据存储器单元中(辅助寄存器AR0~AR7前的*号表示对辅助寄存器间接寻址)程序存储器(pmad)寻址程序存储器(pmad)寻址使用符号(符号地址)或一个表示16位地址的立即数来给出程序空间的地址。例如:MVPDTABLE,*AR4;把TABLE所标注的程序存储器单元中的数复制到AR4所指定的数据存储器中去端口地址(PA)寻址端口地址(PA)寻址使用一个符号(符号地址)或一个表示16位地址的立即数来给出外部I/O口地址。例如:PORTRFIFO,*AR5;把端口地址为FIFO的I/O口中的数复制到AR5指定的数据存储器单元中长立即数*(lk)寻址长立即数*(lk)寻址使用一个符号(符号地址)或一个表示16位地址的立即数来指定数据存储空间的一个地址。例如,,指令可写为:LD*(BUFFER),A;把数据空间中地址为BUFFER单元中的数据传送到累加器A允许所有使用Smem寻址的指令去访问数据空间的任意单元而不改变数据页指针(DP)的值,也不对ARx进行初始化。不能与循环指令(RPT,RPTZ)一起使用。3.累加器寻址累加器寻址是用累加器中的数值作为一个地址读写程序存储器。READASmem;WRITASmem程序存储器数据存储器ASmem程序存储器数据存储器ASmem这两条指令在重复方式下执行,能够对累加器自动增量。4.直接寻址指令中包含数据存储器地址(dma)的低7位。实际地址由数据页指针DP或堆栈指针SP结合这7位地址偏移量,共同形成16位的数据存储器地址。ADD@x,A用一个符号或一个常数来确定偏移值,如上面语句中的x表示数据存储器的低7位值每条指令代码只有一个字CPL=0,9位的数据页指针与7位dma域结合形成16位数据存储器地址。CPL=1,16位的堆栈指针SP的值加上7位dma域形成16位数据存储器地址。例3.1LD#x,DPLD@u,AADD@v,ASSBXCPLLD@X1,AADD@Y2,A……DPuv数据存储器5.间接寻址间接寻址通过辅助寄存器(AR0~AR7)中的16位地址进行寻址。特点:间接寻址不仅能从存储器中读或写一个单16位数据操作数,还能在一个指令中访问两个数据存储器单元,即从两个独立的存储单元读数据,或读一个存储单元同时写另一个存储单元,或读写两个连续的存储单元。LD*AR1+,TMPY*AR2,*AR3,A单操作数寻址指令代码格式:CMPT=0标准方式。ARF确定辅助寄存器,(ARP=0);CMPT=1兼容方式。如果ARF=0,就用ARP来选择辅助寄存器,否则,用ARF来确定辅助寄存器。访问后,ARF的值装入ARP。操作码I=1MODARF15~876~32~01)循环寻址循坏缓冲器长度R需装入缓冲区长度寄存器BK。缓冲器基地址的最低N位必须为0,N是满足2NR的最小整数。循环寻址算法:ARx指向循环缓冲区(index是ARx的低N位)if0=(index+step)BK;index=index+stepelseif(index+step)=BK;index=index+step-BKelseif(index+step)0;index=index+step+BK……*****00000(EFB)*****11111(EOB)R=31ARx位倒序寻址地址以倒序方式产生,进位从左向右,而不是从右向左。AR1=(01100000)2AR0=(00001000)2RPT#15;PORTW*AR1+0B,PA在输出口得到连续顺序排号的信号值0110+11001001双操作数寻址指令代码格式占用程序空间小,运行速度快,用在完成两个读或一个读并行一个写的指令中。只有AR2、AR3、AR4及AR5四个辅助寄存器能用于双操作数寻址。双数据存储器操作数间接寻址类型为*ARx、*ARx-、*ARx+、*ARx+0%。例:MPY*AR2,*AR3,A操作码XmodYmodXarYar7654321015~86.存储器映象寄存器寻址存储器映象寄存器寻址用于修改存储器映象寄存器(MMR)中的内容,而不影响当前数据页指针DP和当前堆栈指针SP。直接寻址:高9位数据存储器地址置0,利用指令中的低7位地址访问MMR。间接寻址:高9位数据存储器地址置0,按当前辅助寄存器中的低7位地址访问MMR。有8条指令可以进行存储器映像寻址:LDMMMR,dstPOPMMMRMVDMdmad,MMRPSHMMMRMVMDMMR,dmadSTLMsrc,MMRMVMMMMRx,MMRySTM#1K,MMR7.堆栈寻址堆栈寻址用于在中断或子程序调用时自动保存PC值或用于保存和传递其他数据。堆栈由高地址向低地址增长,利用16位的存储器映象寄存器——堆栈指针(SP)对堆栈进行寻址,SP总是指向压入堆栈的最后一个数据。堆栈寻址的4条指令:PSHD把一个数据存储器数据压入堆栈;PSHM把一个存储器映象寄存器中的值压入堆栈;POPD从堆栈中弹出一个数据至数据存储器单元;POPM从堆栈中弹出一个数据至存储器映象寄存器。SP…………栈顶栈低第二节程序地址的生成程序计数器PC:存放即将取指的某条指令或即将访问的某个立即操作数或系数表在程序存储器中的地址。将程序存储器地址加载到PC的途径:复位:PC=FF80h顺序执行指令:PC=PC+1分支转移:分支转移指令后的16位立即数加载PC由累加器分支转移:用累加器A或B的低16位值加载PC子程序调用:先将PC+2压入堆栈,用调用指令后的16位立即数加载PC,执行完子程序返回时,将栈顶值弹出加载PC。从累加器调用子程序:先将PC+1压入栈,用累加器A或B的低16位值加载PC,执行完子程序返回时,将栈顶值弹出加载PC。块重复循环:当执行到块重复结束地址(REA),时,将块重复的起始地址(RSA)加载PC。中断:将PC压入堆栈,用适当的中断地址加载PC,返回时将栈顶弹出至PC。1.分支转移利用程序的分支与转移可执行分支转移、循环控制和子程序操作。C54x有两种分支转移形式:无条件分支转移:B[D],用指令后的地址加载PCBACC[D],用指定累加器的低16位作为地址加载PC条件分支转移:BC[D];条件得到满足,用指令中给出的地址加载PCBANZ[D];若当前辅助寄存器不等于0,用指令中给出的地址加载PC带延迟的分支转移,在执行完紧跟分支转移指令后的一条双字指令或两条单字指令后再进行转移;对不带延迟的分支转移,则不予执行,立即进行跳转。2.调用与返回调用指令进行子程序或函数调用时,DSP会中断当前运行的程序,转移到程序存储器的其它地址继续运行。转移前,原程序的下条指令的地址被压入堆栈,而在返回时则将这个地址弹出至PC,继续执行原来的程序。无条件调用与返回指令CALL[D]:将返回地址压入堆栈,用指令所规定的地址加载PC;CALA[D]:将返回地址压入堆栈,用指定累加器的低16位加载PC;RET[D]:用栈顶的返回地址加载PC;RETE[D]:用栈顶的返回地址加载PC,并开放中断;RETF[D]:用快速返回寄存器RTN中的返回地址加载PC,并开放中断有条件调用与返回指令CC[D]:如果指令中所规定的条件得到满足,则将返回地址压入堆栈,然后用所指定的地址加载PC;RC[D]:如果指令中所规定的条件得到满足,则将栈顶的返回地址加载PC。3.条件指令中的条件判断(条件指令中的各种条件见表3-5)多重条件判断:例BCpmad,cond[,cond[,cond]];必须所有的条件都得到满足才跳转pmad.条件组合:第一组:可以同时从A类和B类中选一个条件,但不能从同一类中选两条件;而且,测试的累加器必须是同一个。第二组:可以同时在A、B、C三类中可选一个条件,但不能从同一类中选择两个条件。第一组第二组A类B类A类B类C类EQOVTCCBIONEQNOVNTCNCNBIOLTLEQGTGEQ其它条件指令:条件执行指令XCn,cond[,cond[,cond]]n=1或2;条件得到满足,执行下面的1条或2条指令,条件不满足,则执行1条或2条NOP指令。条件存储指令:SACCDsrc,Xmen,cond;条件满足,累加器高16位左移ASM位存放到Xmen;否则Xmen内容不变。STRCDXmen,cond;条件满足,把T寄存器内容存放到Xmen,否则Xmen内容不变。SRCCDXmen,cond;条件满足,把块循环计数器(BRC)的内容存放到Xmen,否则Xmen内容不变。例:RCTC;若TC=1,则返回,否则往下执行CCsub,BNEQ;若累加器B≠0,则调用sub,否则往下执行BCnew,AGT,AOV;若累加器A0且溢出,则跳转至new,否则往下执行单指令中的多个条件是“与”的关系。如果需要两个条件是“或”的关系,可以写成两条指令。如:BCnew,AGTBCnew,AOV计算y=x1+x2+x3+x4.bssx,4.bssy,1STM#x,AR1STM#3,AR2;AR2作为循环计数器,初值为4LD#0,Aloop:ADD*AR1+,ABANZloop,*AR2-;STLA,y4.单条指令的重复操作:RPT,RPTZC54x具有重复执行下一条指令和重复执行一个程序块若干指令的功能。重复指令可以使乘法、累加和数据块传送这类多周期指令在执行一次之后变成单周期指令,从而提高指令执行的速度。重复指令在执行过程中,对所有中断(除RS、NMI)均不响应。重复计数器(RC):16位,用于加载重复次数。最大值为65535重复指令:RPT,对下一条指令执行n次RPTZ,对目的累加器清0后,执行下一条指令n次利用单条指令的重复操作对数组x[5]={0,0,0,0,0}进行初始化。.bbsx,5STM#x,AR1LD#0,ARPT#4STLA,*AR1+或者.bbsx,5STM#x,AR1RPTZA,#4STLA,*AR1+xAR1000005.块重复操作块重复操作指令RPTB将重复操作的范围扩大到任意长度的循环回路。块重复计数器
本文标题:第3章-DSP指令系统及特点
链接地址:https://www.777doc.com/doc-7869748 .html