程序控制指令用于控制程序的流程,也就是控制指令的执行顺序。按照功能的不同可以将程序控制指令分为7组:分支转移(跳转)指令、调用指令、中断指令、返回指令、重复指令、堆栈操作指令和其他程序控制指令。分别叙述如下。
1.分支转移(跳转)指令
分支转移(跳转)指令可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。这种跳转可以是无条件的跳转,也可以是有条件的跳转。分支转移指令共有6条,见表4-25。
表4-25 分支转移(跳转)指令
TMS320C54x提供的分支转移指令分别为B[D]、BACC[D]、BANZ[D]、BC[D]、FB[D]、FBACC[D]。其中:
1)B[D]和BACC[D]为近程无条件转移指令,B[D]用于将pmad指定的程序存储器地址赋值给程序计数器PC,实现分支转移,pmad可以是符号也可以是数字。BACC[D]用于将src的低16位所确定的地址赋给PC。如果指令是延迟方式的(带有扩展名D),紧跟分支转移语句之后的2条单字指令或者1条双字指令被取出执行,然后程序才跳转到目的地址。注意,该指令不能被重复执行。
2)BANZ[D]和BC[D]为近程条件转移指令,BANZ[D]为辅助寄存器不为0时的分支转移,若当前辅助寄存器ARx不为0,则程序指针转移到指定pmad;否则PC指针加2。BC[D]指令在满足特定条件时,指令就转移到pmad上;否则PC加2且紧接着该指令的两个字继续执行。
3)FB[D]和FBACC[D]为远程无条件转移。FB[D]指令将extpmad的高7位(22~16)确定的页码赋值给程序计数扩展寄存器XPC,将extpmad的低16位(15~0)赋值给PC,实现长跳转。FBACC[D]指令将src的高7位(22~16)赋值给XPC,将src的低16位(15~0)赋值给PC,实现长跳转。
【例4-28】 分支转移(跳转)指令示例。
2.调用指令
调用指令同样可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。但与跳转指令不同的是,DSP在执行完被调用的程序段后要返回起跳处继续执行原来的程序。调用指令共有5条,见表4-26。
表4-26 调用指令
(续)
TMS320C54x提供的调用指令分别为CALA[D]、CALL[D]、CC[D]、FCALA[D]和FCALL[D]。其中:
1)CALA[D]和CALL[D]为近程无条件调用指令,CALA[D]用于将src的低16位所确定的地址赋给PC。CALL[D]指令首先将返回地址压入堆栈,然后将pmad值赋给PC。如果指令是延迟方式的(带有扩展名D),紧跟指令语句之后的2条单字指令或者1条双字指令被取出执行,然后程序才跳转到目的地址。注意,该指令不能被重复执行。
2)CC[D]为近程条件调用指令,如果条件满足,该指令将pmad赋给PC,执行调用;如果条件不满足,PC加2,不做调用,继续执行后面的指令。
3)FCALA[D]和FCALL[D]为远程无条件调用指令,FCALA[D]将返回地址PC和XPC压入堆栈,将src的高7位(22~16)赋值给XPC,将src的低16位(15~0)赋值给PC。FCALL[D]指令首先将返回地址PC和XPC压入堆栈,然后将extpmad的高7位(22~16)赋值给XPC,将extpmad的低16位(15~0)赋值给PC。
【例4-29】 调用指令示例。
3.中断指令
中断指令同样可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。但与调用指令一样,DSP在执行完中断服务程序后要返回发生中断的地方继续执行原来的程序。中断指令共有2条,见表4-27。
表4-27 中断指令
TMS320C54x提供的中断指令INTR和TRAP都是使程序指针PC指向由K所确定的中断向量,允许用户应用软件执行任何中断服务程序。指令执行时,PC值加1后压入栈顶,然后由K确定的中断向量赋值给PC,执行相应的中断服务程序。另外,INTR和TRAP这两条指令的区别是,执行INTR的同时中断标志寄存器IFR中的对应位被清0,INTM置1,关闭所有可屏蔽中断,该指令不受中断屏蔽寄存器(IMR)影响,并且无论INTM如何取值,INTR都能执行;而执行TRAP不会关闭可屏蔽中断,不受INTM状态的影响,也不影响INTM。
【例4-30】 中断指令示例。
4.返回指令
返回指令用于在执行完被调用的程序段或中断服务程序后,返回到调用指令或发生中断的地方,使DSP能继续执行原来的程序。返回指令共有6条,见表4-28。
表4-28 返回指令
TMS320C54x提供的返回指令分别为FRET[D]、FRETE[D]、RC[D]、RET[D]、RETE[D]和RETF[D]。其中:
1)FRET[D]和FRETE[D]为远程无条件返回指令,两条指令均为将栈顶单元的低7位值赋值给XPC,将下一个单元的16位值赋值给PC,实现远程返回,然后堆栈指针加1。如果指令是延迟方式的(带有扩展名D),紧跟指令语句之后的2条单字指令或者1条双字指令被取出执行,然后程序才返回到目的地址。注意,指令不能被重复执行。所不同的是,FRET[D]指令对ST1中的中断屏蔽位INTM无影响,而FRETE[D]指令自动将INTM清0。
2)RC[D]为近程条件返回指令,如果满足给定的条件,堆栈顶部的数据弹出到PC中,SP加1,实现返回,若不满足条件,指令仅执行PC加1。该指令不能被重复执行。(www.xing528.com)
3)RET[D]、RETE[D]和RETF[D]为近程无条件返回指令。RET[D]指令将栈顶的16位数值弹出到PC中,实现返回操作,然后SP加1。RETE[D]指令除了执行RET[D]指令的操作外,还会将INTM位自动清0,使能中断。RETF[D]指令将RTN寄存器的16位数值弹出到PC中,实现中断的快速返回操作,然后SP加1。RTN寄存器中保存着中断服务程序的返回地址,因此返回时PC值不是从堆栈得到,而是从RTN寄存器中得到,该指令也将INTM位自动清0,允许产生中断。这些指令不能被重复执行。
【例4-31】 返回指令示例。
5.重复指令
重复指令可以使DSP重复执行一条指令或一段指令。重复指令共有5条,见表4-29。
表4-29 重复指令
TMS320C54x提供的重复指令分别为RPT、RPTB[D]和RPTZ。其中:
1)RPT用于将紧随该指令之后的指令重复执行n+1次。循环次数n由数据存储器Smem、常数K或lk确定,并放入循环计数器RC中。
2)RPTB[D]用于循环执行某个指令块,循环次数由块循环计数器BRC确定,BRC在指令执行之前被赋值。指令执行时,块循环开始地址寄存器RSA用PC+2(若使用扩展名D时为PC+4)装载,循环结束地址寄存器REA用程序存储器地址pmad装载。单指令循环也可以看做是一种块循环。该指令可以被中断,也可以通过将BRAF位清0来终止块循环。
3)RPTZ用于将dst清0,并重复执行下一条指令lk+1次,常数lk存放在循环计数器RC中。
【例4-32】 重复指令示例。
6.堆栈操作指令
堆栈操作指令可以对堆栈进行压入(PUSH)和弹出(POP)操作,相应的操作数可以是数据存储单元Smem或存储映射寄存器MMR。堆栈操作指令共有5条,见表4-30。
表4-30 堆栈操作指令
TMS320C54x提供的堆栈操作指令分别为FRAME、POPD、POPM、PSHD和PSHM。其中:
1)FRAME用于将短立即数偏移量K累加到SP中。
2)POPD和POPM为弹出堆栈操作,指令将由堆栈指针SP寻址的数据存储器内容复制到Smem或指定的存储器映射寄存器MMR中,然后SP加1。
3)PSHD和PSHM为压入堆栈操作,首先堆栈SP减1,然后将Smem或指定的存储器映射寄存器MMR的内容压入堆栈。
【例4-33】 堆栈操作指令示例。
7.其他程序控制指令
其他程序控制指令共有7条,见表4-31。
表4-31 其他程序控制指令
TMS320C54x提供的其他程序控制指令分别为IDLE、MAR、NOP、RESET、RSBX、SSBX和XC。其中:
1)IDLE指令迫使程序进入等待状态,直到产生非屏蔽中断或者复位操作。K=1或2或3。K=1时,处理器保持空闲状态直到产生一个复位或非屏蔽中断;K=2时,处理器保持空闲状态直到产生一个复位或外部非屏蔽中断;K=3时,处理器保持空闲状态直到产生一个复位或外部非屏蔽中断。
2)MAR指令修改由Smem所确定的辅助寄存器的内容,执行方式由兼容模式位CMPT的取值决定。如果CMPT=1,指令修改ARx和ARP。如果CMPT=0,只修改辅助寄存器ARx的内容而不修改ARP。
3)NOP为空指令,该指令除了PC执行加1操作以外不执行任何操作。这在建立流水和执行延迟方面比较有用。
4)RESET实现了一个非屏蔽的软件复位。
5)位清0指令RSBX和位置1指令SSBX只能对ST0和ST1的特定位进行操作。N指明被修改的状态寄存器,SBIT确定被修改的位。这两条指令常常用于系统的初始化编程,在程序设计中是非常有用的。
6)XC指令为条件执行指令,该指令的执行是由n的值和所选择的条件决定的。
【例4-34】 其他程序控制指令示例。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。