附录 TMS320C54X汇编语言指令系统.docx
《附录 TMS320C54X汇编语言指令系统.docx》由会员分享,可在线阅读,更多相关《附录 TMS320C54X汇编语言指令系统.docx(176页珍藏版)》请在冰豆网上搜索。
附录TMS320C54X汇编语言指令系统
指令系统
TMS320C54x指令系统共有指令130条,由于操作数的寻址方式不同,派生至205条。
按指令的功能,可以将C54x指令系统分成4类:
算术运算指令、逻辑运算指令、程序控制指令、加载和存储指令。
下面分别对各类指令进行介绍。
Ⅰ、算术运算指令
算术运算指令分为加法指令(ADD),减法指令(SUB),乘法指令(MPY),乘加指令(MAC),乘减指令(MAS),双数/双精度指令(DADD,DSUB)和特殊操作指令(ABDST,SQDST)。
1.加法指令
加法指令共有13条,如表1.1.1所示。
表1.1.1加法指令
语法
表达式
说明
字长
周期数
ADDSmem,src
src=src+Smem
操作数加至累加器
1
1
ADDSmem,TS,src
src=src+Smem<操作数移位后加至累加器
1
1
ADDSmem,16,scr[,dst]
src=src+Smem<<16
操作数左移16位后加至累加器
1
1
ADDSmem[,SHIFT],src[,dst]
src=src+Smem<操作数移位后加至累加器
2
2
ADDXmem,SHFT,src
dst=dst+Xmem<操作数移位后加至累加器
1
1
ADDXmem,Ymem,dst
dst=Xmem<<16+Ymem<<16
两个操作数分别左移16位后然后相加
1
1
ADD#lk,[SHFT],src[,dst]
dst=src+#lk<长立即数移位后加至累加器
2
2
ADD#lk,16,src[,dst]
dst=src+#lk<<16
长立即数左移16位后加至累加器
2
2
ADDsrc,[,SHIFT][,dst]
dst=dst+src<累加器移位后相加
1
1
ADDsrc,ASM[,dst]
dst=dst+src<操作数带进位加至累加器
1
1
ADDCSmem,src
src=src+Seme+C
带进位加法
1
1
ADDM#lk,Smem
Smem=Smem+#lk
长立即数加至存储器
2
2
ADDSSmem,src
src=src+uns(Smem)
符号位不扩展的加法
1
1
整数分有符号数和无符号数两种格式,表示有符号数时,其最高位表示符号,最高位为0表示其为正数,1表示为负数;无符号数其最高位仍做为数值位计算。
例如,有符号数能够表示的最大的正数为07FFFh,等于32767,而0FFFFH表示最大的负数–1;无符号数不能表示负数,它能够表示的最大的数为0FFFFh,等于十进制数的65535。
小数符号和上面整数的表示一样,但必须注意如何安排小数点的位置。
2.减法指令
减法指令共有13条,见表1.1.2所示。
表1.1.2减法指令
语法
表达式
说明
字长
周期数
SUBSmem,src
src=src-Smem
从累加器中减去操作数
1
1
SUBSmem,TS,src
src=src-Smem<从累加器中减去移位后的操作数
1
1
SUBSmem,16,scr[,dst]
dst=dst-Smem<<16
从累加器中减去左移16位后的操作数
1
1
SUBSmem[,SHIFT],src[,dst]
dst=src-Smem<操作数移位后与累加器相减
2
2
SUBXmem,SHFT,src
src=src-Xmem<操作数移位后与累加器相减
1
1
SUBXmem,Ymem,dst
dst=Xmem<<16-Ymem<<16
两个操作数分别左移16位后相减
1
1
SUB#lk[,SHFT],src[,dst]
dst=dst-#lk<长立即数移位后与累加器相减
2
2
SUB#lk,16,src[,dst]
dst=src-#lk<<16
长立即数左移16位后与累加器相减
2
2
SUBsrc,[,SHIFT][,dst]
dst=dst-src<源累加器移位后与目的累加器相减
SUBsrc,ASM[,dst]
dst=dst-src<源累加器按ASM移位后与目的累加器相减
1
1
SUBBSmem,src
src=src-Smem-C
从累加器中减去带借位减操作数
1
1
SUBCSmem,src
if(src-Smem<<15)≥0
src=(src-Smem<<15)<<1+1
elsesrc=src<<1
有条件减法
1
1
SUBSSmem,src
src=src-uns(Smem)
符号位不扩展的减法
1
1
3.乘法指令
乘法指令共有10条,见表1.1.3。
表1.1.3乘法指令
语法
表达式
说明
字长
周期数
MPYSmem,dst
dst=T*Smem
T寄存器值与操作数相乘
1
1
MPYRSmem,dst
dst=rnd(T*Smem)
T寄存器值与操作数相乘(带舍入)
1
1
MPYXmem,Ymem,dst
dst=Xmem*Ymem,T=Xmem
两个操作数相乘
1
1
续表
语法
表达式
说明
字长
周期数
MPYSmem,#lk,dst
dst=Smem*#lk,T=Smem
长立即数与操作数相乘
2
2
MPY#1k,dst
dst=T*#lk
长立即数与T寄存器值相乘
2
2
MPYAdst
dst=T*A(32~16)
T寄存器与累加器A高位相乘
1
1
MPYASmem
B=Smem*A(32~16),T=Smem
操作数与累加器A高位相乘
1
1
MPYUSmem,dst
dst=uns(T)*uns(Smem)
无符号数乘法
1
1
SQURSmem,dst
dst=Smem*Smem,T=Smem
操作数的平方
1
1
SQURA,dst
dst=A(32~16)*A(32~16)
累加器A高位的平方
1
1
4.乘加和乘减指令
乘加和乘减指令共有22条,见表1.1.4所示。
表1.1.4乘加和乘减指令
语法
表达式
说明
字长
周期数
MACSmem,src
src=src+T*Smem
操作数与T寄存器值相乘后加至累加器
1
1
MACXmem,Ymem,src[,dst]
dst=src+Xmem*Ymem
T=Xmem
两个操作数相乘后加至累加器
1
1
MAC#lk,src[,dst]
dst=src+T*#lk
长立即数与T寄存器值相乘后加至累加器
2
2
MACSmem,#lk,src[,dst]
dst=src+Smem*#lk
T=Smem
长立即数与操作数相乘后加至累加器
2
2
MACRSmem,src
dst=rnd(src+T*Smem)
操作数与T寄存器值相乘后加至累加器(带舍入)
1
1
MACRXmem,Ymem,src[,dst]
dst=rnd(src+Xmem*Ymem)
T=Xmem
两个操作数相乘后加至累加器(带舍入)
1
1
MACASmem[,B]
B=B+Smem*A(32~16)
T=Xmem
操作数与累加器A高位相乘后加至累加器B
1
1
MACAT,src[,dst]
dst=src+T*A(32~16)
T寄存器值与累加器A高位相乘
1
1
MACARSmem[,B]
B=rnd(B+Smem*A(32~16))
T=Smem
T值与累加器A高位相乘后加至累加B(带舍入)
1
1
MACART,src[,dst]
dst=rnd(src+T*A(32~16))
A高位与T值相乘后与源累加器相加(带舍入)
1
1
MACDSmem,pmad,src
src=src+Smem*pmad
T=Smem,(Smem+1)=Smem
操作数与程序存储器值相乘后累加并延迟
2
3
续表
语法
表达式
说明
字长
周期数
MACPSmem,pmad,src
Src=src+Smem*pmad
T=Smem
操作数与程序存储器值相乘后加至累加器
2
3
MACSUXmem,Ymem,src
src=src+uns(Xmem)*Ymem
T=Xmem
无符号数与有符号数相乘后加至累加器
1
1
MASSmem,src
src=src-T*Smem
从累加器中减去T寄存器值与操作数的乘积
1
1
MASRXmem,Ymem,src[,dst]
dst=rnd(src-Xmem*Ymem)
T=Xmem
从累加器中减去两操作数的乘积(带舍入)
1
1
MASXmem,Ymem,src[,dst]
dst=src-Xmem*Ymem
T=Xmem
从源累加器中减去两操作数的乘积
1
1
MASRSmem,src
src=rnd(src-T*Smem)
从累加器中减去T值与操作数的乘积(带舍入)
1
1
MASASmem[,B]
B=B-Smem*A(32~16)
T=Smem
从累加器B中减去操作数与累加器A高位的乘积
1
1
MASAT,src[,dst]
dst=src-T*A(32~16)
从源累加器中减去T寄存器值与累加器A高位乘积
1
1
MASART,src[,dst]
dst=rnd(src-T*A(32~16))
从源中减去T寄存器值与累加器A高位乘积(带舍入)
1
1
SQURASmem,src
src=src+Smem*Smem
T=Smem
操作数平方并累加
1
1
SQURSSmem,src
src=src-Smem*Smem
T=Smem
从累加器中减去操作数的平方
1
1
5.双操作数指令
双操作数指令共有6条,见表1.1.5所示。
表1.1.5双操作数指令
语法
表达式
说明
字长
周期数
DADDLmem,src[,dst]
ifC16=0,dst=Lmem+src
ifC16=1
dst(39~16)=Lmem(31~16)+src(31~16)
dst(15~0)=Lmem(150)+src(15~0)
双精度/双16位数加至累加器
1
1
DADSTLmem,dst
ifC16=0,dst=Lmem+(T<<16+T)
ifC16=1
dst(39~16)=Lmem(31~16)+T
dst(15~0)=Lmem(15~0)-T
双精度/双16位数与T寄存器值相加/减
1
1
续表
语法
表达式
说明
字长
周期数
DRSUBLmem,src
ifC16=0,src=Lmem-src
ifC16=1
src(39~16)=Lmem(31~16)-src(31~16)
src(15~0)=Lmem(15~0)-src(15~0)
双精度/双6位数中减去累加器值
1
1
DSADTLmem,dst
IC16=0,dst=Lmem-(T<<16+T)
IfC16=1
dst(39~16)=Lmem(31~16)-T
dst(15~0)=Lmem(15~0)+T
长操作数与T寄存器值相加减
1
1
DSUBLmem,src
IfC16=0,src=src-Lmem
ifC16=1
src(39~16)=src(31~16)-Lmem(31~16)
src(15~0)=src(15~0)-Lmem(15~0)
从累加器中减去双精度/双16位数
1
1
DSUBTLmem,dst
IfC16=0,dst=Lmem-(T<<16+T)
ifC16=1
dst(39~16)=Lmem(31~16)-T
dst(15~0)=Lmem(15~0)-T
从长操作数中减去T寄存器值
1
1
6.特殊应用指令
特殊应用指令共有15条,见表1.1.6所示。
表1.1.6特殊应用指令
语法
表达式
说明
字长
周期数
ABDSTXmem,Ymem
B=B+|A(32~16)|,
A=(Xmem–Ymem)<<16
绝对距离
1
1
ABSsrc[,dsst]
dst=|src|
累加器值取绝对值
1
1
CMPLsrc[,dst]
dst=src
累加器取反
1
1
DELAYSmem
(Smem+1)=Smem
存储器单元延迟
1
1
EXPsrc
T=numberofsignbits(src)–8
求累加器中数据的指数
1
1
FIRSXmem,Ymem.pmand
B=B+A*pamd,A=(Xmem+Ymem)<<16
对称FIR滤波
2
3
LMSXmem,Ymem
B=B+Xmem*Ymem,A=(A+Xmem<<16)+215
求最小均方值
1
1
MAXdst
dst=max(A,B)
求累加器(A,B)最大值
1
1
MINdst
dst=min(A,B)
求累加器(A,B)最小值
1
1
NEGsrc[,dst]
dst=-src
累加器取反
1
1
续表
语法
表达式
说明
字长
周期数
NORMsrc[,dst]
dst=src<归一化
1
1
PLOYSmem
B=Smem<<16,A=rnd(A*T+B)
求多项式的值
1
1
RNDsrc[,dst]
dst=src+215
累加器四舍五入运算
1
1
SATsrc
saturate(src)
累加器饱和运算
1
1
SQDSTXmem,Ymem
B=B+A(32~16)*A(32~16),A=(Xmem-Ymem)<<16
求两点距离的平方
1
1
Ⅱ、逻辑运算指令
逻辑运算指令包括与指令(AND),或指令(OR),异或指令(XOR),移位指令(ROL)和测试指令(BITF)。
1.与指令
与指令共5条,见表2.2.1。
表2.2.1与指令
语法
表达式
说明
字长
周期数
ANDSmem,src
src=src&Smem
操作数与累加器相与
1
1
AND#lk[,SHFT],src[,dst]
dst=srclk<长立即数移位后与累加器相与
2
2
AND#lk,16,src[,dst]
dst=srclk<<16
长立即数左移16位后与累加器相与
2
2
ANDsrc[,SHIFT][,dst]
dst=dst&src<源累加器移位后与目的累加器相与
1
1
ANDM#lk,Smem
Smem=Smemlk
操作数与长立即数相与
2
2
2.或指令
或指令共5条,见表2.2.2。
表2.2.2或指令
语法
表达式
说明
字长
周期数
ORSmem,src
src=src|Smem
操作数与累加器相或
1
1
OR#lk[,SHFT],src[,dst]
dst=src|#lk<长操作数移位后与累加器相或
2
2
OR#lk16,src[,dst]
dst=src|#lk<<16
长操作数左移16位后与累加器相或
2
2
ORsrc[,SHIFT][,dst]
dst=dst|src<源累加器移位后和目的累加器相或
1
1
ORM#lk,Smem
Smem=Smem|#lk
操作数和长立即数相或
2
2
3.异或指令
异或指令共5条,见表2.2.3。
表2.2.3异或指令
语法
表达式
说明
字长
周期数
XORSmem,src
src=src∧Smem
操作数和累加器相异或
1
1
XOR#lk[,SHFT],src[,dst]
dst=src∧#lk<长立即数移位后和累加器相异或
2
2
XOR#lk,16,src[,dst]
dst=src∧#lk<<16
长立即数左移16位后和累加器相异或
2
2
XORsrc[,SHIFT][,dst]
dst=dst∧src<源累加器移位后和目的累加器相异或
1
1
XORM#lk,Smem
Smem=Smem∧#lk
操作数和长立即数相异或
2
2
4.移位指令
移位指令共6条,见表2.2.4。
表2.2.4移位指令
语法
表达式
说明
字长
周期数
ROLsrc
Rotateleftwithcarryin
累加器经进位位循环左移
1
1
ROLTCsrc
RotateleftwithTCin
累加器经TC位循环左移
1
1
RORsrc
Rotaterightwithcarryin
累加器经进位位循环右移
1
1
SFTAsrc,SHIFT[,dst]
dst=src<累加器算术移位
1
1
SFTCsrc
ifsrc(31)=src(30)thensrc=src<累加器条件移位
1
1
SFTLsrc,SHIFT[,dst]
dst=src<累加器逻辑移位
1
1
5.测试指令
测试指令共5条,见表见表2.2.5。
表2.2.5测试指令
语法
表达式
说明
字长
周期数
BITXmem,BITC
TC=Xmem(15-BITC)
测试指定位
1
1
BITFSmem,#lk
TC=(Smemlk)
测试由立即数指定的位
2
2
BITTSmem
TC=Smem(15-T(3-0))
测试由T寄存器指定的位
1
1
CMPMSmem,#lk
TC=(Smem==#lk)
存储单元与长立即数比较
2
2
CMPRCC,ARx
CompareARxwithAR0
辅助寄存器ARx与AR0比较
1
1
Ⅲ、程序控制指令
程序控制指令包括分支指令(B,BC),调用指令(CALL),中断指令(INTR,TRAP),返回指令(RET),重复指令(RPT),堆栈操作指令(FRAME,POP),其它程序控制指令(IDLE,NOP)。
分别例于下列表中。
1.分支指令
分支指令共6条,见表3.3.1。
表3.3.1分支指令
语法
表达式
说明
字长
周期数
B[D]pmad
PC=pmad(15~0)
无条件分支转移
2
4/[2*]
BACC[D]src
PC=src(15~0)
按累加器规定地址转移
1
6/[4*]
BANZ[D]pmad,Sind
if(Sind(s)≠0)
thenPC=pmad(15~0)
辅助寄存器不为0转移
2
4‡/2§/[2*]
BC[D]pmad,cond[cond[,cond]]
if(cond(s))
thenPC=pmad(15~0)
条件分支转移
2
5‡/3§/[3*]
FB[D]extpmad
PC=pmad(15~0),
XPC=pmad(22~16)
无条件远程分支转移
2
4/[2*]
FBACC[D]src
PC=src(15~0),
XPC=src(22~16)
按累加器的地址远程分支转移
1
6/[4*]
‡条件为真,§条件为假,*延迟指令
2.调用指令
调用指令共5条,见表3.3.2。
表3.3.2调用指令
语法
表达式
说明
字长
周期数
CALA[D]src
--SP=PC
PC=src(15~0)
按累加器的地址调子程序
1
6/[4*]
CALL[D]pmad
--SP=PC
PC=pmad(15~0)
无条件调用子程序
2
4/[2§]
CC[D]pmad,cond[cond[,cond]]
if(cond(s))then--SP=PCPC=pmad(15~0)
有条件调用子程序
2
5‡/3§/[3*]
FCALA[D]src
--SP=PC,--SP=XPC
PC=src(15~0)
XPC=src(22~16)
按累加器的远程调子程序
1
6/[4*]
FCALL[D]extpmad
--SP=PC,--SP=XPC
PC=pmad(15~0)
XPC=pmad(22~16)
无条件远程调用子程序
2
4[2*]
3.中断指令
中断指令有2条,见下表。
表3.3.3中断指令
语法
表达式
说明
字长
周期数
INTRK
--SP=PC
PC=IPTR(15~7)+K<<2
INTM=1
非屏蔽软件中断,关闭其他可屏蔽中断
1
3
TRAPK
--SP=PC
PC=IPTR(15~7)+K<<2
非屏蔽软件中断,不影响INTM位
1
3
4.返回指令
返回指令共有6条,见下表。
表3.3.4返回指令
语法
表达式
说明
字长
周期数
FRET[D]
XPC=SP++,PC=SP++
远程返回
1
6/[4*]
FRETE[D]
XPC=SP++,PC=SP++
INTM=0
开中断,从远程中断返回
1
6/[4*]
RC[D]cond[,cond[,cond]]
If(cond(s))thenPC=SP++
条件返回
1
5‡/3§/[3*]
RET[D]
PC=SP++
返回
1
5/[3*]
RETE[D]
PC=SP++,INTM=0
开中断,从中断返回
1
5/[3*]
RETF[D]
PC=RTN,SP++,INTM=0
开中断,从中断快速返回
1
3/[1*]
5.重复指令
重复指令共5条,见下表。
表3.3.5重复指令
语法
表达式
说明
字长
周期数
RPTSmem
重复执行一条指令,RC=Smem
重复执行下条