1、第三章 TMS320C54X DSP芯片的指令系统,指令的表示方法 寻址方式 指令系统,目录,3.2 指令的表示方法,指令的两种表示法: 助记符形式和代数表达式 助记符形式: 代数表达式:MPY *(volume),B B=T*(volume) ADD #1h,5,A,B B=A+#1h5 语句格式: 由操作码和操作数组成 标号:指令操作数列表 ;注释,编写程序一般规则(P138),所有语句必须以标号、空格、星号或分号开始; 所有包含汇编伪指令的语句必须在一行完全指定; 可以选择带有标号,若使用标号,则标号必须从第一列开始,但指令域一定不能从第1列开始;,程序中可以有注释: 注释开始在第一列时
2、,前面需标上星号或分号; 但在其他列开始的注释前面只能标上分号。 操作数域: 立即数,寄存器,程序空间地址,数据空间地址或I/O地址。 立即数:#为前缀,间接寻址:*为前缀。,汇编语言源程序举例,* * * * * * * * * * * * * * * * * * example.asm * * * * * * * * * * * * * * * * * *.title “example.asm”.mmregs STACK .usect “STACK”,10H .bss a,4 .bss x,4.bss y,1,汇编语言源程序举例,.def start.data table: .word 1
3、,2,3,4 .word 8,6,4,2 .text start: STM #0,SWWSR STM #STACK+10H,SP STM #a,AR1RPT #7 MVPD table,*AR1+,CALL SUM end: B end SUM: STM #a,AR3STM #x,AR4RPTZ A,#3MAC *AR3+,*AR4+,ASTL A,yRET.end,3.2.1 指令系统中的符号,符号与缩写 P82页:表3.2.1 如:MVPD pmad,SmemMPY Xmem,Ymem,dst 程序存储器操作数(存储器地址): Pmad,extpmad,Pmem 数据存储器操作数: dma
4、d, Dmem, Smem, Sind, Xmem, Ymem, Lmem(32位),累加器: Src,dst,dst_,A,B 移位值: ASM,TS,SHFT,SHIFT 立即数: K,k3,k5,k9,lk运算符及其优先级,表3.2.2,3.1 寻址方式,两种:数据寻址和程序寻址 数据寻址(7种基本方式) 立即数寻址 绝对地址寻址 累加器寻址 直接寻址 间接寻址 存储器映射寄存器寻址 堆栈寻址 表3.1.1:,程序寻址 程序存储器:存放程序代码,系数表和立即数 程序地址生成器(PAGEN)产生地址,再加载到PAB总线 P47-48,数据寻址(立即数寻址),立即数寻址(K,k3,k5,k9
5、,lk) 短立即数:3,5,8,9位(单字指令中) 长立即数:16位(双字指令中), 立即数: #前缀 LD #80h, A RPT #99 ;单字指令 RPT #7DFFH ;双字指令,数据寻址(绝对地址寻址),指令中包含16位地址,寻址存储单元; 至少为双字长指令,有四种类型: 数据存储器地址(dmad)寻址 操作数存放于数据存储单元,确定该单元地址,主要指令:MVDK Smem, dmad ;dmad=SmemMVDM dmad, MMRMVKD dmad, SmemMVMD MMR, dmad,例:MVDM 2000H,T RPT #19 ;数据块的复制MVMD AR2,SAMPLE
6、;SAMPLE为常数表示;的地址 MVKD 0200H,*AR2+,程序存储器地址(pmad)寻址 确定程序存储器中的一个地址 主要指令:FIRS Xmem, Ymem, pmadMACD Smem, pmad, srcMACP Smem, pmad, srcMVDP Smem, pmadMVPD pmad, Smem,例:MVPD TABLE, *AR7- MACP *AR3-,COEFFS,A,数据寻址(绝对地址寻址),端口地址(PA)寻址(符号或常数) 确定外部I/O端口的地址 主要指令:PORTR PA, SmemPORTW Smem, PA 例: PORTR FIFO, *AR5PO
7、RTW *AR1+, FIFO1,*(lk)寻址 用符号或常数指明数据存储器中的一个地址 不能与循环指令(RPT,RPTZ)一起使用! 例: STL A,*(y)STH A, *(y1)LD *(PN),A,数据寻址举例(1),x .set 2000hportr 20h,*(x)stm #x,ar1ld #100,bmacp *ar1,100h,b,累加器寻址,对存放数据的程序存储器寻址 将累加器的内容作为地址(16位或23位)去访问程序存储器单元 仅两条指令:WRITA和READA 循环执行,可实现数据块的传送。,READA Smem 将累加器A所确定的程序存储器单元中的值传送到数据存储单元
8、。 如:若A=00 0000 0100h, AR1=0200h,执行下列指令:READA *AR1,WRITA Smem 将Smem所确定的数据存储单元中的值传送到累加器A所确定的程序存储器单元。 如:STM #0300H,AR2LD #18000H,AWRITA *AR2,直接寻址,由基地址(DP或SP提供)和低7位偏移地址(指令中提供)共同构成16位数据存储器地址。 64K的数据空间: 分成512页,每页128个单元 DP取值范围:0511 7位偏移地址范围:0127 不改变基地址,可寻址连续的128个单元 DP复位值为0,直接寻址,直接寻址指令代码的格式 图3.1.1 优点:单字指令 基
9、地址由DP还是SP提供? 由CPL(ST1中)标志位的值决定 CPL=0:基地址由DP(9位)提供 CPL=1:基地址由SP(16位)提供,16位数据地址的形成过程: CPL=0时,9位DP值为高位,指令中7位偏移值为低位,构成16位数据存储器地址。 CPL=1时,16位SP的值与指令中7位偏移值相加,形成16位数据存储器地址。,16位数据地址的形成过程,直接寻址举例(1),基地址由DP提供:ld #4,dp ; 页指针指向数据M第4页,;片内数据区DARAMst #1,1 st #2,2 st #3,3 st #4,4,直接寻址举例(2),基地址由SP提供:STM #4000H ,SPSSB
10、X CPL ST #9876h, 3,直接寻址举例(3),.bss x,1.LD #x,DPST #1000H,xST #2000H,x+1ST #3000H,x+2,数据寻址举例(2),y .set 007ahld #40h,dpst #1111h,*(y)mvkd 7ah,7ah,易混淆的问题!,LD #40H,DPSTL A,60H ;60H:数据存储器2060H单元STM #2000H,AR1MVDK *AR1,60H; 60H:数据存储器0060H单元MVDP *AR1,60H ;60H:程序存储器0060H单元,间接寻址,按照辅助寄存器中的地址访问数据存储单元; 8个辅助寄存器(1
11、6位):AR0AR7; 非常灵活:方便访问连续的存储器块(递增,递减,变址等); 两个辅助寄存器算术单元ARAU0和ARAU1;,间接寻址,单操作数间接寻址: 一条指令中访问一个数据存储器单元 寻址灵活,4位方式域定义单操作数间接寻址类型,表3.1.5 两种特殊的寻址:循环寻址和位倒序寻址方式 如:AR2=1000HST #1000H, *AR2,间接寻址,间接寻址,说明:,*ARx+与*+ARx的区别 *ARx+,*ARx-的增减量: 16位字:增/减量为1 32位字:增/减量为2 *ARx-0B 0:AR0 B:位反转寻址的标志,说明:,*ARx-0% %:循环寻址的标志 *ARx(lk)
12、与*+ARx(lk)的区别,双操作数间接寻址,一条指令中同时访问两个数据存储器单元。 完成执行2次读操作或1次读和1次并行存储操作。 仅两个二进制位(Xar和Yar)用于选择辅助寄存器。 只能用4个辅助寄存器:AR2AR5,2位方式域(Xmod和Ymod)定义双操作数间接寻址类型: 表3.1.9 仅4种类型 例如: MAC Xmem, Ymem, src,dstMAC *AR2+,*AR3+,A,间接寻址举例:,STM #2000h,AR2 ST #1234h,*AR2 STM #2010h,AR3ST #5678h,*AR3,STM #4000h,AR2 STM #-1,AR0 MVPD 2
13、000H,*AR2+ ;MVPD 2000H,*+AR2 ;MVPD 2000H,*AR2+0 ;MVPD 2000H,*+AR2(1000h) ;MVPD 2000H,*AR2(1000h),循环寻址,循环缓冲区:卷积,自相关,FIR滤波器等算法中常用。 例如:N=7的FIR滤波器的循环缓冲区,例:FIR滤波器,COEF,MACD *AR2-,COEF,A,ar2,循环寻址是实现循环缓冲区的关键。 用%表示循环寻址: ARx+%、ARx-% ARx+0%、ARx-0% 参数:长度寄存器BK,有效基地址EFB,尾基地址EOB,循环寻址,循环缓冲区的起始地址最低N (NR,R为循环缓冲区长度)位
14、必须为0: 若R=31, 则N=5 若R=32, 则N=6 循环寻址时,首先要指定一个辅助寄存器ARx指向循环缓冲区,并实现循环缓冲区首尾单元相邻。,循环寻址算法:,循环寻址举例:,(BK)=8,(AR1)=0060H,用”*AR1+%”间接寻址. 第1次间接寻址后,AR1指向0061H单元; 第2次间接寻址后, AR1指向0062H单元; 第7次间接寻址后,AR1指向0067H单元; 第8次间接寻址后,AR1又回到0060H单元.,循环寻址举例:,(BK)=10,N=4,(AR1)=0100H,用”*+AR1(8)%”间接寻址:STM #10,BKLD *+AR1(8)%,A ;寻址0108
15、H单元STL A,*+AR1(8)% ;寻址0106H单元,位倒序寻址,主要用于FFT算法。 8点FFT的位码倒序: 若输入顺序:X(0)、X(1)、X(2) 、X(3)、 X(4) 、X(5) 、X(6)、X(7); 则输出顺序:Y(0)、 Y(4)、Y(2) 、Y(6)、 Y(1) 、Y(5) 、Y(3)、 Y(7). 16点FFT的位码倒序:表3.1.6,位反转寻址,通常,在进行FFT算法之前,先让输入数据实现位码倒置。 位倒序寻址用B表示,典型: ARx+0B,16点FFT的位倒序寻址实现方法举例: 设AR2=2060h,作为基地址,指向X(0)的存储单元。 一般:AR0取FFT长度的
16、一半,即AR0=0008h 用*AR2+0B实现位倒序寻址:从左向右加。,例如:STM #8,AR0RPT #15MVDD *AR2+0B,*AR4+;AR2:输入数据X的首地址; AR4 :位码倒置后输入数据X的首地址,第1次*AR2+0B寻址;AR2=2068h, 即X(8) 第2次*AR2+0B寻址;AR2=2064h 即X(4) 第3次*AR2+0B寻址; AR2=206Dh 即X(12),第4次*AR2+0B寻址; AR2=2062h 即X(2) 第5次*AR2+0B寻址; AR2=206ah 即X(10),存储器映射寄存器寻址,用途:主要用于不改变DP、SP的情况下,修改MMR中的
17、内容。 特点: 寻址速度快,对MMR执行写操作开销小; 可直接利用MMR的名称快速访问数据存储空间的第0页资源; 只能寻址数据空间的第0页单元。,仅有8条指令,堆栈寻址,常用于中断和调用子程序过程 “后进先出”的原则 堆栈:保存PC值和保存数据参数 堆栈存放数据:从高地址向低地址增长,SP总是指向堆栈中最后存入的数据单元 入栈:先(SP)-1,数据再入栈. 出栈:数据出栈,SP+1.,4条指令:,堆栈寻址举例:,PSHM T PSHD *AR3+ ;SP - 1, *AR3所指单元数据入栈 POPM T POPD *AR2 ;数据出栈,存入*AR2所指向单元,SP+1,寻址方式举例,DDAT1
18、 .set 1000HPDAT1 .set 2000HRSBX CPLLD #1234h,A ;立即数寻址ST #5678h,*(DDAT1);立即数寻址和绝对地址寻址,LD #PDAT1,A READA 2H;立即数寻址,直接寻址(DP指针)和累加器寻址 SSBX CPLST #9876h, 3H ;直接寻址(SP指针)RSBX CPL,STM #DDAT1,AR2 ST #9876h,*AR2;间接寻址 MVDK 3H,DDAT1 MVKD DDAT1, 1H;直接寻址和绝对地址(dmad)寻址,MVDP 2H,PDAT1;直接寻址和绝对地址(pmad)寻址STM #8888h,T ;立即
19、数寻址和存储器映射寄存器寻址 PSHM T POPM T;堆栈寻址和存储器映射寄存器寻址,STM #4000h,AR0RPT #29MVPD 1000H,*AR0+ ;程序存储器到数据存储器数据块的复制,STM #2000H,AR2STM #3000H,AR3LD #0,ARPT #19 MAC *AR2+,*AR3+,A STL A,*(y);完成20次乘累加操作,用循环缓冲区实现FIR,STM #xn+79,AR3STM #h+79,AR4STM #80,BKSTM #-1,AR0PORTR PA1,*(xn) Fir:RPTZ A,#79MAC *AR3+0%,*AR4+0%,ASTH
20、A,*(y)PORTW *(y),PA0PORTR PA1,*AR3+0%,3.3 C54X的指令系统,共有129条基本指令,包含了6种基本类型的操作: 数据传送指令 算术运算指令 逻辑运算指令 程序控制指令 并行操作指令 重复操作指令,数据传送指令:装载、存储、混合装载存储。 算术指令:包括加减、乘法、乘累加、乘累减、32位操作数运算指令以及其他一些专用指令,逻辑指令:包括与、或、异或、移位和测试指令等 程序控制指令:包括跳转、调用、中断、返回、重复 并行操作指令: 重复操作指令:,3.3.1 数据传送指令,指从存储器中将源操作数传送到目的操作数所指定的存储器中。 数据传送指令包括: 装载指
21、令: 存储指令: 混合装载和存储指令:,装载指令,装载指令,将立即数或存储器内容赋值给目的寄存器。 目的寄存器主要有:dst、T、DP、ASM、ARP等 典型: LD Smem, dst LD #k, dst LD Smem, T LD Smem, DP LD #k5,ASM LDM MMR, dst,举例:,给累加器赋值: 例1、2、4、6 注:SXM、OVB、OVM等标志位的影响 给其他寄存器赋值 DP、T、ASM等 长字指令:DLD Lmem,dst 例:DLD *AR3+,B ;增量为2,给DP赋值:.bss x,1 ;x=2000h.text start: ld #x,dp ;dp=
22、40hstm #0200h,ar4st #0fedch,*ar4ld *ar4,dp ;dp=0dch,存储指令,将源操作数或立即数存入指定存储器或MMR。 目的操作数:Smem,Lmem,MMR等,存储指令,条件存储指令,存储指令,ST:源操作数为寄存器或立即数 例1、3 STH/STL:源操作数为累加器 例1、2 STM/STLM:目的操作数为MMR STM:例1、2 STLM:不管页指针DP或ARx的高9位为何值,有效地址高9位都清零。访问数据页第0页,例1、2。,DST: 长字 CMPS: CSSU电路,混合装载和存储指令,在存储器之间或内部传送数据 表3.3.3 缩写:Smem,Xm
23、em,Ymem,dmad,pmad,PA, 包括I/O端口绝对地址寻址 包括累加器寻址 例:,算术运算指令,加法指令 ADD,ADDC(带进位,如32位扩展精度加法),ADDM(长立即数),ADDS(无符号数) 减法指令 SUB,SUBB(带借位),SUBC(条件减),SUBS(无符号),举例,例:使用ADD指令完成加法LD TEMP1 ,A ;TEMP1AADD TEMP2,A ;TEMP2+AASTL A ,TEMP3 (STH A,TEMP4 );将结果TEMP3,TEMP4,例:用ADDS实现32位数据装入LD 4 , DP ;设置DPLD 60h , 16 ,A ;将(0260H)装
24、入A的高16位ADDS 61h , A ;(0261H)A的低16位 或 DLD 60h , B ;32位数B (C16=0),减法指令,SUB,SUBB,SUBC,减法指令举例,STM 2061H , AR2STM 2060H , AR3 SUB *AR2+ , *AR3+ , B ; (2061H)左移16位,同时(2060H)也左移16位,然后相减,结果BSTH B ,*(2062H) ;相减的结果(16位)(2062H),乘法指令 MPY,MPYR(凑整),MPYA(A的高端),MPYU(无符号),SQUR(平方) 后缀R和A,状态标志位FRCT,另一乘数在T寄存器。 乘加和乘减指令
25、乘加:MAC MACA MACD MACP MACSU 乘减:MAS MASA SQURA SQURS,乘法指令,乘法指令举例,MPY 13, A MPY *AR2, *AR4+0%, B MPY #0FFFEh, A MPYR 0, B MPYA *AR2 MPYA B MPYU *AR0, A SQUR A, B,乘法-累加指令举例,区别:凑整 MAC *AR5+, A MACR *AR5+, A 区别: MAC *AR5+, *AR6+,A, B MACR *AR5+, *AR6+,A, B 存储器延迟:(Smem+1)=Smem MACD *AR3, COEFFS, A MACP *A
26、R3, COEFFS, A,乘法-减法指令举例,MAS *AR5+, A MAS *AR5+, *AR6+, A, B SQURA *AR3+, A SQURS *AR3+, A,算术运算指令,长操作数,长字指令(共6条) DADD,DSUB,DRSUB,DADST,DSAD,DSUBT C16(ST1)决定指令工作方式,0:双精度方式;1:双字方式 Lmem:两个连续单元,低地址存放高16位字,高地址存放低16位字 *AR3-(减量为2),特殊应用指令,ABDST:两矢量的距离 ABS:绝对值 CMPL:累加器的反码 DELAY:存储器延迟 EXP,NORM:累加器归一化 FIRS、LMS
27、、POLY MAX,MIN,NEG RND,SAT, SQDST等,特殊指令举例:,DELAY *AR3 EXP B与NORM B联合使用 MAX A SAT B,逻辑运算指令,分为:与、或、异或、移位、测试 与AND,ANDM(立即数) 或OR,ORM (立即数) 异或XOR,XORM (立即数),循环移位 ROL:带进位位的循环左移, C-D0, D31-C,保护位清零。 ROR、ROLTC: 条件移位 SFTC src 算术移位和逻辑移位 SFTA、SFTL,算术移位,SFTA: 对累加器的整个40位操作 右移:SXM=1,高位符号扩展;SXM=0,高位0填充 左移:低位以0填充,逻辑移
28、位,SFTL: 对累加器的低32位操作,高8位填0 均不受SXM的影响 右移时高位填0 左移时低位填0,举例:SFTA与SFTL的区别,例1: SFTA A, 5, B SFTL A, 5, B 例2: SFTA B, +5 SFTL B, +5,测试指令,BIT:测试指定位 BITF:测试指定的多个位 BITT:测试T指定位 CMPM:比较两数是否相等 如:CMPM *AR4+, 0404h CMPR:比较ARx和AR0,程序控制指令,长转移,长调用:前缀F(PC,XPC) 延时转移:后缀D 1)分支指令B,BACC,BANZ,BC,FB,FBACC 2)调用指令CALA,CALL,CC,F
29、CALA,FCALL 3)中断指令INTR k,TRAP k,4)返回指令RET,RETE,RETF,RC,FRET,FRETE 5)堆栈操作指令FRAME K,POPD,POPM,PSHD,PSHM 6)其他程序控制指令IDLE,MAR,NOP,RESET,RSBX,SSBX,XC,分支指令,无条件转移B: BACC:无条件转移到ACC指定的地址 条件转移 BANZ:当ARx不为0时转移 如:BANZ LOOP,*AR2-,条件指令,BC:条件转移 CC:条件调用 RC:条件返回 例: RC TC ;TC=1,则返回 CC SUB1,BNEQ ;B不为0,则调用SUB1 BC NEXT,AG
30、T,AOV ;A0并且溢出(两条件相与),则转到NEXT,分支指令,调用指令,中断指令,返回指令,堆栈操作指令,其他程序控制指令,RSBX:指定标志位清0 SSBX:指定标志位置1 XC:条件执行指令 如果满足条件,则执行紧接的n条单字指令 n:1或2 注:条件的修改,例: SUBC DEN,A XC 1,BLTNEG ASTL A,QUOT,其他程序控制指令,重复指令,重复指令:RPT,RPTB,RPTZ 可省去跳转,条件判断,流水线打断等,高效率循环执行指令 RPT,RPTZ:可将多周期指令变为单周期指令(如, MVPD) RPT:单指令重复 循环计数器RC,RPTB:块重复指令 几个寄存器:BRC,RSA,REA,标志位BRAF RPTZ: 多重循环,合理安排可减少执行时间 最内层循环:RPT或RPTZ 次内层循环:RPTB 其余层循环:BANZ,并行操作指令,1)并行装入和存储指令ST LD 2)并行装入和乘法指令LD MAC,LD MAS 3)并行存储和加减指令ST ADD,ST SUB 4)并行存储和乘法ST MAC,ST MAS,ST MPY,并行装载和存储指令,并行指令,所有并行指令均为单字指令 多总线同时工作 注意移位 ST LD DB总线和EB总线同时工作 先读后写原则,