3.2 指令系统
TMS320C54x可以使用助记符方式和表达式方式两套指令系统。TMS320C54x指令系统可以分成算术指令、逻辑指令、程序控制指令、装入和存储指令4种基本类型。
3.2.1 符号与意义
表3-9中列出TMS320C54x指令系统的符号和意义。
表3-9 TMS320C54x指令系统的符号与意义
续表
续表
3.2.2 TMS320C54x的指令系统
TMS320C54x指令一共有129条,按功能分为算术运算指令、逻辑指令、程序控制指令、存储和装入指令、单个循环指令5类。
1.算术运算指令
算术运算指令包括加法指令(ADD)、减法指令(SUB)、乘法指令(MPY)、乘加指令(MAC)、乘减指令(MAS)、双数/双精度指令(DADD,DSUB)和特殊操作指令(ABDST,SQDST)。其中大部分指令都只需一个指令周期,只有个别指令需要2~3个指令周期。
(1)加法指令
加法指令共有13条,如表3-10所示。
表3-10 加法指令
DSP表示整数时,包括有符号数和无符号数两种格式。作为有符号数表示时,其最高位表示符号,最高位为0表示其为正数,为1表示其为负数,最低位表示1,次低位表示2的1次方,次高位表示2的14次方。作为无符号数表示时,最高位仍然作为数值位计算。例如,有符号数所能够表示的最大的正数为07FFFH,等于十进制数32767,而0FFFFH表示最大的负数-1;无符号数不能表示负数,它能够表示的最大的数为0FFFFH,等于十进制数的65535。
DSP表示小数时,其符号和上面整数的表示一样,但是必须注意如何安排小数点的位置。原则上,小数点的位置可以根据程序员的爱好安排,为了便于数据处理,一般安排在最高位后(以下仅以小数点在最高位后的情况进行讨论),最高位表示符号位,次高位表示0.5,然后是0.25,依次减少一半。例如,4000H表示小数0.5,1000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)0.000030517578125。
TMS320C54x中提供了多条用于加法的指令,如ADD、ADDC、ADDM和ADDS。其中,ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法运算。
使用ADD指令完成加法运算:
LD TEMP1,A ;将变量TEMP1装入累加器A中 ADD TEMP2,A ;将变量TEMP2与累加器A相加,结果放入A中 STL A,TEMP3 ;将结果(低16位)存入变量TEMP3中
注意,这里完成计算TEMP3=TEMP1+TEMP2,没有特意考虑TEMP1和TEMP2是整数还是小数,在加法和下面的减法运算中,整数运算和定点的小数运算都是一样的。
利用ADDS指令实现32位数据装入: LD #0,DP ;设置数据页指针 LD 60H,16,A ;将60H的内容装入A的高16位 ADDS 61H,A ;将61H的内容加到A的低16位 DLD 60H,B ;直接装入32位到B累加器
(2)减法指令
减法指令共有13条,如表3-11所示。
表3-11 减法指令
TMS320C54x中提供了多条用于减法的指令,如SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带借位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。SUB指令与ADD指令一样,有多种寻址方式。例如:
STM #60H,AR3 ;将变量TEMP1的地址装入AR3寄存器中 STM #61H,AR2 ;将变量TEMP3的地址装入AR2寄存器中 SUB *AR2+,*AR3,B ;将变量TEMP3左移16位,同时变量TEMP2也左移16位 ;然后相减,结果放入累加器B(高16位)中,同时AR2加1 STH B,63H ;将相减的结果(高16位)存入变量63H
在TMS320C54x中没有提供专门的除法指令。一般有两种方法可以完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复若干次减法完成除法运算。
下面这几条指令就是利用SUBC来完成整数除法(TEMP1/TEMP2)的:
LD TEMP1,B ;将被除数TEMP1装入B累加器的低16位 RPT #15 ;重复SUBC指令16次 SUBC TEMP,B ;使用SUBC指令完成除法 STL B,TEMP3 ;将商(B累加器的低16位)存入变量TEMP3中 STH B,TEMP4 ;将余数(B累加器的高16位)存入变量TEMP4中
在TMS320C54x中实现16位的小数除法与前面的整数除法基本一样,也是使用SUBC指令来完成的。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数,在执行SUBC指令前,应将被除数装入A或B累加器的高16位,而不是低16位,其结果的格式与整数除法一样;第二,应当考虑符号位对结果小数点的影响,所以应将商右移一位,得到正确的有符号数。
(3)乘法指令
乘法指令共有10条,如表3-12所示。
表3-12 乘法指令
在TMS320C54x中提供大量的乘法运算指令,其结果都是32位的,放在A或B累加器中。乘数在TMS320C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和A或B累加器的高16位。若是无符号数乘法,则使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其他指令都是有符号数的乘法。
实现整数乘法举例:
SSBX FRCT ;清FRCT标志,准备整数乘 LD TEMP1,T ;将变量TEMP1装入T寄存器 MPY TEMP2,A ;完成TEMP2*TEMP1,结果放入A累加器(32位)
实现小数乘法举例:
SSBX FRCT ;FRCT=1,准备小数乘法 LD TEMP1,16,A ;将变量TEMP1装入累加器A的高16位 MPYA TEMP2 ;完成TEMP2乘累加器A的高16位,结果在B中, ;同时将TEMP2装入T寄存器 STH B,TEMP3 ;将乘积结果的高16位存入变量TEMP3
在TMS320C54x中,小数的乘法与整数乘法基本相同,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。TMS320C54x中提供一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移1位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。
(4)乘加和乘减指令
乘加和乘减指令共有22条,如表3-13所示。
(5)双操作数指令
双操作数指令共有6条,如表3-14所示。
(6)特殊应用指令
特殊应用指令共有15条,如表3-15所示。
表3-13 乘加和乘减指令
表3-14 双操作数指令
表3-15 特殊应用指令
续表
2.逻辑指令
逻辑指令包括与指令(AND)、或指令(OR)、异或指令(XOR)、移位指令(ROL)和测试指令(位F)。根据操作数的不同,这些指令需要1~2个指令周期。
(1)与指令
与指令共有5条,如表3-16所示。
表3-16 与指令
(2)或指令
或指令共有5条,如表3-17所示。
表3-17 或指令
(3)异或指令
异或指令共有5条,如表3-18所示。
表3-18 异或指令
(4)移位指令
移位指令共有6条,如表3-19所示。
表3-19 移位指令
(5)测试指令
测试指令共有5条,如表3-20所示。
表3-20 测试指令
3.程序控制指令
程序控制指令包括分支指令(B,BC)、调用指令(CALL)、中断指令(INTR,TRAP)、返回指令(RET)、重复指令(RPT)、堆栈操作指令(FRAME,POP)和其他程序控制指令(IDLE,NOP),这些指令根据不同情况分别需要1~6个指令周期。
(1)分支指令
分支指令共有6条,如表3-21所示。
表3-21 分支指令
(2)调用指令
调用指令共有5条,如表3-22所示。
表3-22 调用指令
(3)中断指令
中断指令共有两条,如表3-23所示。
表3-23 中断指令
(4)返回指令
返回指令共有6条,如表3-24所示。
表3-24 返回指令
(5)重复指令
重复指令共有5条,如表3-25所示。
表3-25 重复指令
(6)堆栈操作指令
堆栈操作指令共有5条,如表3-26所示。
表3-26 堆栈操作指令
(7)其他程序控制指令
其他程序控制指令共有7条,如表3-27所示。
表3-27 其他程序控制指令
4.装入指令
装入和存储指令包括一般存储指令(ST),一般装入指令(LD),条件存储指令(CMPS、SACCD),并行装入和存储指令(LD||ST),并行装入和乘法指令(LD||MAC),并行存储和加减指令(LD||ADD、LD||SUB),并行存储和乘法指令(ST||MAC),以及其他存储和装入指令(MVDD、PORTW、READA)。这些指令根据不同情况分别需要1~5个指令周期。
(1)一般存储指令
一般存储指令共有14条,如表3-28所示。
表3-28 一般存储指令
(2)一般装入指令
一般装入指令共有21条,如表3-29所示。
表3-29 一般装入指令
(3)条件存储指令
条件存储指令共有4条,如表3-30所示。
表3-30 条件存储指令
(4)并行装入和存储指令
并行装入和存储指令共有两条,如表3-31所示。
表3-31 并行装入和存储指令
(5)并行装入和乘法指令
并行装入和乘法指令共有4条,如表3-32所示。
表3-32 并行装入和乘法指令
(6)并行存储和加减指令
并行存储和加减指令共有两条,如表3-33所示。
表3-33 并行存储和加减指令
(7)并行存储和乘法指令
并行存储和乘法指令共有5条,如表3-34所示。
表3-34 并行存储和乘法指令
(8)其他存储和装入指令
其他存储和装入指令共有12条,如表3-35所示。
表3-35 其他存储和装入指令
5.单个循环指令
TMS320C54x有单个循环指令,它们引起下一指令被重复执行。重复执行的次数由单个循环指令中的一个操作数决定,并等于操作数加1。该操作数的值被存储在一个16位的重复计数寄存器(RC)中。该寄存器中的值只能由单个循环指令中的操作数决定,其最大值是65536。当下一条指令被重复执行时,绝对程序或数据地址将自动加1。当重复指令被解码时,所有中断(包括NMI,不包括RS)均被屏蔽,直到下一条指令被重复执行完毕。重复的功能体现在一些指令中,如乘加或块移动指令,这样就增加了指令的执行速度。下列指令是因为重复执行而由多重循环变成单重循环的。
(1)单个循环指令
对单个数据存储器操作数指令而言,若有一个长的偏移地址或绝对地址,指令不可被循环执行。单个循环指令共有11条,如表3-36所示。
表3-36 单个循环指令
(2)不可使用RPT或RPTZ指令循环执行的指令
不可使用RPT或RPTZ指令循环执行的指令共有36条,如表3-37所示。
表3-37 不可使用RPT或RPTZ指令循环执行的指令
在TMS320C54x系列中,有一些特殊的DSP指令,它们在一个指令周期内,用一条指令就可以实现一般需要几条指令才可实现的功能,如MAC指令,它可以在一个指令周期中完成一次乘法和一次加法运算。这样既节省了时间,又提高了编程的灵活性。