第二章指令系统
本章要求:
1、要求看到陌生指令能够通过查指令表,既通过助记符及操作数来找到该指令原型,根据指令说明读懂该指令。
2、根据指令表中的指令原型,通过阅读指令说明,能够选择合适的寻址方式,使用该指令。
举例说明:ADD *ar2,A; 查找指令原形,P313
ADD *ar3+,16,A,B ;查找指令原形P313
STL A , @x ; 查找指令原形P326
MPY Smem,dst;P337读懂表达式,使用MPY *ar2,A MPY Xmem,Ymem,dst ;P338读懂含义,
使用MPY*ar2+,*ar3+,A; A=(*ar2)*(*ar3)
ST #lk,Smem ;P341,读懂指令含义,使用ST #1000h,@a 指令系统中使用的符号及缩略语,详细表格见教材P130
第二章指令系统
以下为一些常用指令,希望大家对各指令有所了解。
TMS320C54x的指令集有近两百条指令,按功能分为如下几类:
•算术运算指令
•逻辑运算指令
•程序控制指令
•装入和存储指令
一、算术运算指令
算术运算指令可分为如下几类:
•加法指令
•减法指令
•乘法指令
•乘加指令
•乘减指令
•双数/双精度指令
•特殊操作指令
1、加法指令
定点DSP中数据表示方法
•当它表示一个整数时,其最低位(D0)表示1,D1位表示2的1次方,次高位(D14)表示2的14方。
•如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。
例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式显示)。
•当需要表示小数时,小数点的位置始终在最高为后,而最高位(D15)表示符号位。
这样次高位(D14)表示0.5,然后是0.25,最低位(D0)表示。
所以04000H 表示小数0.5,01000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)
0.000030517578125。
实现16位定点加法
•‘C54X中提供了多条用于加法的指令,如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寄存器,
;等同于前两条语句
ADD中寻址方式
•ADD Smem [,SHIFT],src [,dst] 例如:•ADD *AR0,1,A,A
•ADD @60H,-1,A,A
•ADD *AR5,1,A,B •ADD Xmem, SHFT, src 例如:•ADD *AR5,1,A
•ADD Xmem,Ymem, dst 例如:•ADD *AR2,*AR3,A
2、减法指令
实现16位定点减法
•‘C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。
其中SUBS 用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。
SUB指令与ADD 指令一样,有许多的寻址方式。
减法指令使用举例
.bss a,1;定义变量a
.bss b,1;定义变量b
stm#a,ar2;将变量a的地址装入ar2寄存器
stm#b,ar3;将变量b的地址装入ar3寄存器
sub*ar2+,*ar3,b;将变量a左移16位同时变量
;b也左移16位,然后相减,结
;果放入累加器B(高16位)中,寻
;址后ar2加1。
sth b,@63h;将相减的结果(高16位)存入变量63h
利用SUBC实现除法
•在‘C54X中没有提供专门的除法指令,一般有两种方法来完成除法。
一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。
这种方法对于除以常数特别适用。
另一种方法是使用SUBC指令,重复16次减法完成除法运算。
利用SUBC完成Temp1/Temp2 temp1.word100;定义常量temp1
temp2.word30;
.bss temp3,1;定义常量temp3
.bss temp4,1
ld@temp1,B;将被除数temp1装入B寄存
;器的低16位
rpt#15;重复SUBC指令16次
subc@temp2,b;使用SUBC指令完成除法
stl B,@temp3;将商(B寄存器的低16位)
;存入变量temp3
sth B,@temp4;将余数(B寄存器的高16位)
;存入变量temp4
实现小数除法
•在‘C54X中实现16位的小数除法与前面的整
数除法基本一致,也是使用SUBC指令来完成。
但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。
在执行SUBC指令前,应将被除数装入A
或B寄存器的高16位,而不是低16位。
其结果的格式与整数除法一样。
第二,应考虑符号位对结果小数点的影响。
所以应对商右移一位,得到正确的有符号数。
3、乘法指令
实现16定点整数乘法
•在‘C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。
乘数在‘C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。
如果是无符号数乘时,请使用MPYU指令。
这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
整数乘法举例
rsbx FRCT;清FRCT标志,准备整数乘ld temp1,T;将变量temp1装入T寄存器mpy temp2,a;完成temp2*temp1,结果放
;入累加器A(32位)
实现小数乘法
•在‘C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。
‘C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移1位。
两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。
小数乘法举例
ssbx FRCT;FRCT=1,准备小数乘法
ld temp1,16,a;将变量temp1装入寄存器A的高16位mpya temp2;完成temp2乘寄存器A的高16位,结;果在B中,同时将temp2装入T寄存器
sth b,temp3;将乘积结果的高16位存入变量temp3如:0.1(0x0ccd) x 0.7(0x599a) =
0.06997680664063(0x08f5)
注:可以使用MPYR完成四舍五入。
比较如下结果mpyr temp1,b ; T * temp1 --> b
4、乘加和乘减指令
5、双精度/
双数操作指令
6、特殊指令
二、逻辑运算指令
逻辑指令包括与、或、异或、移位和测试指令1、与指令(AND)
2、或、异或指令
3、移位和测试指令
三、程序控制指令
程序控制指令包括:分支指令
调用指令
中断指令
返回指令
重复指令
堆栈操作指令
混合程序控制指令
1、分支指令
2、调用与中断指令
3、返回指令
4、重复指令和堆栈操作指令
5、混合程序控制指令
四、装入和存储指令装入和存储指令包括:
一般的装入和存储指令
条件存储指令
并行装入和存储指令
并行装入和乘法指令
并行存储和加件乘指令
混合装入和存储指令
1、一般的装入指令
2、存贮指令
3 并行装入和存储指令
4、条件存储指令
5、并行存储和加、减、乘法指令
6、并行装入和乘法指令
7、混合装入和存储指令。