DSP

TI C66x DSP 指令集 -之- 跳转指令B

2019-07-13 09:59发布

       跳转指令用于实现程序流程的跳转,在 ARM (同样在TI C66x DSP)程序中有两种方法可以实现程序流程的跳转:
使用专门的跳转指令(如B指令)。
直接向程序计数器 PC写入跳转地址值 通过向程序计数器 PC写入跳转地址值,可以实现在 4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LRPC等类似指令,可以保存将来的返回地址值,从而实现在 4GB连续的线性地址空间的子程序调用 ARM指令集中的跳转指令可以完成从当前指令向前或向后的 32MB的地址空间的跳转,包括以下4条指令:
— B 
 跳转指令TI C66x DSP指令集也有该指令)
B
指令的格式为:
B  
目标地址; //程序跳转到目标地址处执行
B  
 Label          //程序无条件跳转到标号Label处执行 B指令是最简单的跳转指令。一旦遇到一个 B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行,并需要重新装入PC(程序计数器),使执行流水线中断。注意存储在跳转指令中的实际值是相对当前 PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是24位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26(前后 32MB的地址空间) 如下面的汇编代码(摘自TI C66x DSP汇编代码) B.S1 $C$L48 //表示跳转到$C$L48 label;B.S1 SetUeAntInfo  //表示跳转到SetUeAntInfo函数;0x1083EF60是指令地址 下图中,第一条指令,如果A0=true,会跳转到0x8008b8执行,0x8008b8是当前cpu访问自己所属corePacL2资源时使用的内部地址,对外别名地址0x108008b8corePac1的L2地址),0x118008b8corePac2的L2地址),0x128008b8corePac3的L2地址),0x138008b8corePac4的L2地址),即外设访问corePac的L2资源或者当前CPU访问其他corePac的L2资源时,会使用32位的别名地址。第二条指令,跳转到B0B0存的是地址)去执行。 下图摘自TMS320C66x_DSP_CPU_and_Instruction and Set.pdf文档,表明B指令会有5个cycle的延迟(可能是在等待硬件更新PC的值,在这5个延迟的cycle期间,CPU将继续执行B指令后面的指令,直到5个cycle后,才真正的跳转,所以跳转前执行了5个无用的指令),图中Program Counter就是程序计数器(PC)。   该指令在CPU的S2功能单元执行,指令操作吗如下。