dsp汇编指令系统介绍(精)
- 格式:doc
- 大小:57.50 KB
- 文档页数:22
汇编指令集本节根据指令的功能来分,提供六张表来说明指令集的概况:累加器、算数和逻辑指令(表2);辅助寄存器和数据页指针指令(表3);TREG、PREG和乘法指令(表4);转移指令(表5);控制指令(表6);I/O和存储器操作(表7)。
在每张表中,指令按字母顺序排列。
执行每条指令所需要的周期数在表中给出,所有指令都假设从内部程序存储器和内部数据存储器中执行,指令的周期数适用于单指令执行,不适用于重复方式。
编程时,用户必须对每条指令的寻址方式了解清楚,因此这里也在表中给出了每条指令的寻址方式。
由于指令的操作码对用户编程没有多大指导意义,在这里就没有列出来。
为了参照起见,我们先定义这六张概述表的符号意义:ACC 累加器。
ARBITXCM 辅助寄存器。
4位数值,用于指定数据存储器数值中的哪一位将被BIT指令所测试。
2位数值,CMPR指令执行CM值所声明的比较:若CM=00,测试当前AR=AR0否;若CM=01,测试当前AR<AR0否;若CM=10,测试当前AR>AR0否;若CM=11,测试当前AR≠AR0否。
ShiftTP 4位右移量。
用于条件执行指令的2位数值,代表如下4种条件:若BIO引脚为低,TP=00;若TC位=1,TP=01;若TC位=0,TP=10;无条件TP=11。
ARX 用于LAR和SAR指令的3位数据值,指定被操作的辅助寄存器。
52表2 累加器、算数和逻辑指令 ABS周期|(ACC)|→ACC 1(ACC)+(数据存储器地址)×12shift→ACC(ACC)+(数据存储器地址)×216→ACC 1(ACC)+k→ACC 1shift(ACC)+lk×2→ACC 2指令功能(ACC)+(数据存储器地址)+(C)→ACC寻址方式直接/间接直接/间接短立即数长立即数指令说明ACC取绝对值移位时低位填0,若SXM=1,高位用符号扩展;若SXM=0,高位填0;结果存在ACC中,该指令使C=0。
第六章 DSP的寻址方式和汇编指令当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。
根据程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。
汇编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种操作。
在本章节当中将主要以基于C28x的DSP芯片为例,为读者讲解DSP的寻址方式和汇编指令系统,其中大部分内容也可适用于其他Ti公司的DSP产品。
6.1汇编语言指令集概述在学习C28x系列DSP的寻址方式和汇编指令指令之前,先来对一些基础的知识进行讲解一下先,在汇编程序当中开发人员会常常使用到许多的特殊符号和标志,它们都具有特殊的含义,在学习汇编之前读者们必须先理解这些符号和标志含义,在这里会对其中最常用最重要的操作数符号和寄存器经行详细说明。
在进行汇编讲解之前先来了解一下开发的核心——CPU。
在TMS320C2000系列中,CPU 内核为:C20x/C24x/C240x:C2xLP:C27x/C28x:C27x、C28x这些CPU的硬件结构有一定差别,指令集也不相同,但是,在C28x芯片中可以通过选择兼容特性模式,使C28xCPU与C27xCPU及C2xLPCPU具有最佳兼容性。
可通过状寄存器STl的位OBJMODE和位AMODE的组合,选定模式。
C28x芯片具有3种操作模式:1.C28x模式:在该模式中,用户可以使用C28x的所有有效特性、寻址方式和指令系统,因此,一般应使C28x芯片工作于该种模式。
2.C27x目标——兼容模式:在复位时,C28x的CPU处于C27x目标-兼容模式。
在该模式下,目标码与C27xCPU完全兼容,且它的循环—计数也与C27xCPU兼容。
3.C2xLP源——兼容模式:该模式允许用户运行C2xLP的源代码,这些源代码是用C28x代码生成工具编译生成的。
在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。
DSP汇编指令引言DSP是指数字信号处理器,是一种专门用于数字信号处理的微处理器。
DSP汇编指令是在DSP芯片上执行操作的命令。
这篇文档将常见的DSP汇编指令及其使用方法。
通用指令MOVMOV是Move的缩写,指将数据从一个寄存器移动到另一个寄存器或内存地址中。
它有很多不同的格式,例如:MOV R1, #0 ; 将0存储在R1寄存器中MOV R2, R1 ; 将R1寄存器中的值复制到R2寄存器中MOV @R3, R2 ; 将R2寄存器中的值存储在R3指向的内存地址中ADD和SUBADD和SUB分别表示加法和减法运算。
它们也有不同的格式,例如:ADD R1, R2 ; 将R2寄存器中的值加到R1寄存器中ADD R1, #2 ; 将2加到R1寄存器中SUB R1, R2 ; 将R2寄存器中的值从R1寄存器中减去AND和ORAND和OR分别表示按位与和按位或运算。
它们也有不同的格式,例如:AND R1, R2 ; 将R1寄存器和R2寄存器中的值按位与后存储在R1寄存器中OR R1, R2 ; 将R1寄存器和R2寄存器中的值按位或后存储在R1寄存器中CMPCMP是Compare的缩写,用于比较两个值。
它会将两个操作数相减,并设置相关的标志位。
它的格式如下:CMP R1, R2 ; 比较R1和R2寄存器中的值跳转指令JMPJMP是Jump的缩写,用于无条件跳转到目标地址。
它的格式如下:JMP label ; 跳转到标签为label的位置JNZ和JZJNZ和JZ分别表示如果结果不为零则跳转和如果结果为零则跳转。
它们的格式如下:JNZ label ; 如果前一条CMP指令比较结果不为零,则跳转到标签为label的位置JZ label ; 如果前一条CMP指令比较结果为零,则跳转到标签为label的位置JGE和JLEJGE和JLE分别表示如果大于或等于则跳转和如果小于或等于则跳转。
它们的格式如下:JGE label ; 如果前一条CMP指令比较结果大于或等于,则跳转到标签为label的位置JLE label ; 如果前一条CMP指令比较结果小于或等于,则跳转到标签为label的位置循环指令DJNZDJNZ是Decrement and Jump if Not Zero的缩写,表示如果操作数不为零则减1并跳转到目标地址。
DSP汇编指令总结DSP汇编指令总结⼀、寻址⽅式:1、⽴即寻址:短⽴即寻址(单指令字)长⽴即数寻址(双指令字)第⼀指令字第⼆指令字16位常数=16384=4000h2、直接寻址ARU 辅助寄存器更新代码,决定当前辅助寄存器是否和如何进⾏增或减。
N规定是否改变ARP值,(N=0,不变)4.3.1、算术逻辑指令(28条)4.3.1.1、加法指令(4条);4.3.1.2、减法指令(5条);4.3.1.3、乘法指令(2条);4.3.1.4、乘加与乘减指令(6条);4.3.1.5、其它算数指令(3条);4.3.1.6、移位和循环移位指令(4条);4.3.1.7、逻辑运算指令(4条);4.3.2、寄存器操作指令(35条)4.3.2.1、累加器操作指令(6条)4.3.2.2、临时寄存器指令(5条)4.3.2.3、乘积寄存器指令(6条)4.3.2.4、辅助寄存器指令(5条)4.3.2.5、状态寄存器指令(9条)4.3.2.6、堆栈操作指令(4条)4.3.3、存储器与I/O操作指令(8条)4.3.3.1、数据移动指令(4条)4.3.3.2、程序存储器读写指令(2条)4.3.3.3、I/O操作指令(2条)4.3.4、程序控制指令(15条)4.3.4.1、程序分⽀或调⽤指令(7条)4.3.4.2、中断指令(3条)4.3.4.3、返回指令(2条)4.3.4.4、其它控制指令(3条)4.3.1、算术逻辑指令(28条)4.3.1.1、加法指令(4条);▲ADD▲ADDC(带进位加法指令)▲ADDS(抑制符号扩展加法指令)▲ADDT(移位次数由TREG指定的加法指令)4.3.1.2、减法指令(5条);★SUB(带移位的减法指令)★SUBB(带借位的减法指令)★SUBC(条件减法指令)★SUBS(减法指令)★SUBT(带移位的减法指令,TREG决定移位次数)4.3.1.3、乘法指令(2条);★MPY(带符号乘法指令)★MPYU(⽆符号乘法指令)4.3.1.4、乘加与乘减指令(6条);★MAC(累加前次积并乘)(字数2,周期3)★MAC(累加前次积并乘)★MPYA(累加-乘指令)★MPYS(减-乘指令)★SQRA(累加平⽅值指令)★SQRS(累减并平⽅指令)4.3.1.5、其它算数指令(3条);★ABS(累加器取绝对值指令)★NEG(累加器取补码指令)★NORM(累加器规格化指令)返回4.3.1.6、移位和循环移位指令(4条);▲ SFL(累加器内容左移指令)▲ SFR(累加器内容右移指令)▲ROL(累加器内容循环左移指令)▲ROR(累加器内容循环右移指令)返回4.3.1.7、逻辑运算指令(4条);▲ AND(逻辑与指令)▲ OR(逻辑或指令)▲ XOR(逻辑异或指令)▲ CMPL(累加器取反指令)返回4.3.2、寄存器操作指令(35条)4.3.2.1、累加器操作指令(6条)▲ LACC(装载累加器指令)▲ LACT(装载累加器)*按TREG低4位指定的次数移位▲ LACL(装载累加器低16位指令)▲ ZALR(装载累加器指令)▲ SACL(移位并存储累加器低半部)▲ SACH(移位并存储累加器⾼半部)返回4.3.2.2、临时寄存器指令(5条)▲ LT(装载TREG指令)▲ LTA(装载TREG并累加上次乘积指令)▲ LTS (装载TREG并减去上次乘积指令)▲ LTD(装载TREG并累加上次乘积及数据移动指令)▲LTP(装载TREG和累加器指令)返回4.3.2.3、乘积寄存器指令(6条)▲ PAC (乘积寄存器内容载⼊累加器)▲ APAC (PREG与累加器相加)▲ SPAC(累加器和乘积寄存器相减)▲ LPH(装载PREG⾼16位指令)▲ SPL(存储PREG低16位指令)▲ SPH(存储PREG⾼16位指令)返回4.3.2.4、辅助寄存器指令(5条)★LAR(装载当前辅助寄存器AR)★SAR(存储辅助寄存器指令)★MAR(修改当前辅助寄存器)★SBRK(从当前辅助寄存器减去短⽴即数)返回4.3.2.5、状态寄存器指令(9条)★LST(装载状态寄存器)★SST(存储状态寄存器)★SETC(控制位置“1”指令)★SETC(控制位置“1”指令)★LDP(装载数据指针DP指令)★BIT(位测试指令)★BITT(测试由TREG指定bit code指令)★CMPR(⽐较当前辅助寄存器AR和AR0)返回4.3.2.6、堆栈操作指令(4条)★PUSH(累加器低16位进栈指令)★POP(栈顶内容弹出⾄累加器低16位指令)★POP(栈顶内容弹出⾄累加器低16位指令)★POPD(弹栈⾄数据存储器指令)返回4.3.3、存储器与I/O操作指令(8条)4.3.3.1、数据移动指令(4条)▲DMOV(数据存储器内部数据移动指令)▲SPLK(存储长⽴即数⾄数据存储器指令)▲BLDD(数据存储器内部的数据块移动)▲ BLPD(从程序存储器到数据存储器的数据块传送)4.3.3.2、程序存储器读写指令(2条)★TBLR(读程序存储器数据到数据存储器)★TBLW(写程序存储器)4.3.3.3、I/O操作指令(2条)★IN(数据输⼊指令)★OUT(数据输出指令)4.3.4、程序控制指令(15条)4.3.4.1、程序分⽀或调⽤指令(7条)★B(⽆条件转移指令)★BANZ(辅助寄存器内容不等于零转移)★CALL(⽆条件⼦程序调⽤指令)★BACC(按累加器内容转移指令)★CALA(由累加器指定地址的⼦程序调⽤指令)★CC(条件调⽤指令)4.3.4.2、中断指令(3条)★INTR(软中断指令)★TRAP(软件陷阱中断)★NMI(⾮屏蔽中断)4.3.4.3、返回指令(2条)★RET(⽆条件从⼦程序或中断返回)★RETC(条件返回指令)4.3.4.4、其它控制指令(3条)★RPT(重复执⾏下条指令)★NOP(空操作)★IDEL(暂停)返回。
C2的指令集C2xx DSP中共有汇编语言指令88条,分成6类:①累加器、算术和逻辑指令26条如:ADD、LACC、AND②辅助寄存器和数据页面指针指令7条如:MAR、LAR等③TREG、PREG和乘法指令20条如:LT、MTY、PAC等④分支、调用指令12条如:B、BCND、INTR等⑤控制指令15条如:SPM、POP、BIT等⑥存储器和I/O操作指令8条如:BLDD、SPLK、TBLR等注:有些指令助记符是增强性指令,对应于几条简单指令(机器码),如:ADD 可完成ADD,ADDH,ADDK和ADLK等功能,这样做可使程序更简洁并易读。
累加器,算术与逻辑指令助记符指令描述指令的中英文指令字周期ABSACC的绝对值Absolute Value of Accumulator(累加器内容取绝对值11ADD 加给ACC,带0~15-bit移位,直接或间接Add to Accumulator(加入累加器)11加给ACC,带0~15-bit移位,长立即数22加给ACC,带16-bit移位,直接或间接1 1加给ACC,短立即数1 1ADDC 加给ACC,带进位,直接或间接Add to Accumulator With Carry(带进位位加至累加器)1 1ADDS加给ACC低段,带符号展开抑制,直接或间接Add to Accumulator With Sign ExtensionSuppressed(抑制符号扩展加至累加器)1 1ADDT加给ACC,由TREG决定移位,直接或间接Add to Accumulator With Shift Specifiedby TREG(按TREG寄存器内容移位后加至累加器)1 1AND ACC与数据值,直接或间接AND With Accumulator(和累加器逻辑“与”)1 1ACC与长立即数,带0~15-bit移位2 2ACC与长立即数,带16-bit移位2 2CMPLACC取补Complement Accumulator(累加器求反(补)1 1LACC 带移位0~15-bit装入ACC,直接或间接Load Accumulator With Shift(数据左移后装入累加器)1 1带移位0~15-bit装入ACC,长立即数2 2带移位16-bit装入ACC,直接或间接1 1LACL 装入ACC的低段,直接或间接Load Low Accumulator and Clear HighAccumulator(装载累加器低位并清累加器高位)1 1装入ACC的低段,短立即数1 1LACT 装入ACC,由TREG低4位(0~3bit)决定移位(0~15bit),直接或间接Load Accumulator With Shift Specifiedby TREG(按TREG规定的移位后装入累加器)1 1NEG ACC取负Negate Accumulator(累加器求负) 1 1NORMACC内容归一化,间接Normalize Contents of Accumulator(规格化累加器)1 1OR ACC或数据值,直接或间接OR With Accumulator(与累加器逻辑“或” )1 1ACC或长立即数,带0~15-bit移位2 2ACC或长立即数,带16-bit移位2 2ROLACC循环左移Rotate Accumulator Left(累加器逻辑循环左移)1 1RORACC循环右移Rotate Accumulator Right(累加器逻辑循环右移)1 1SACH 存高段ACC,带移位0~7-bit,直接或间接Store High Accumulator With Shift(移位并存储累加器高位)1 1SACL 存低段段ACC,带移位0~7-bit,直接或间接Store Low Accumulator With Shift(移位并存储累加器低位)1 1SFLACC左移Shift Accumulator Left(累加器算术左移)1 1SFRACC右移Shift Accumulator Right(累加器算术右移)1 1SUB 从ACC减,带移位0~15 - bit,直接或间接Subtract From Accumulator (从累加器减 1 1从ACC减,带移位 0~15-bit,长立即数2 2从ACC减,带移位 16- bit,1 1直接或间接从ACC减,短立即数1 1SUBB 从ACC带借位减,直接或间接Subtract From Accumulator With Borrow(带借位从累加器减1 1SUBC 条件减,直接或间接Conditional Subtract(条件减法 1 1SUBS从ACC减,抑制符号展开,直接或间接Subtract From Accumulator With SignExtension Suppressed (抑制符号扩展从累加器减1 1SUBT 从ACC减,由 TREG决定的移位( 0~15-bit),直接或间接Subtract From Accumulator With ShiftSpecified by TREG (按TREG指定的值进行移位后从累加器减1 1XOR ACC异或数据值,直接或间接Exclusive OR With Accumulator (与累加器逻辑“异或”1 1ACC异或长立即数,带0~15-bit移位2 2ACC异或长立即数,带16-bit移位2 2ZALR ACC低段置0,舎入后装入ACC高段,直接或间接Zero Low Accumulator and Load HighAccumulator With Rounding(累加器低位清零并四舍五入装载累加器高位1 1辅助寄存器指令助记符指令描述指令的中英文指令字周期ADRK 常数加给AR,短立即数Add Short-Immediate Value toAuxiliary Register(短立即数加至当前辅助寄存器1 1BANZ 当前AR非0转移,间接Branch on Auxiliary RegisterNot Zero(辅助寄存器不等于2 2零转移CMPR 当前AR与AR0比较Compare Auxiliary RegisterWith AR0 (比较当前辅助寄存器和AR0,并把比较结果放在ST1的TC位1 1LAR 从指定的数据位置装入指定的AR,直接或间接Load Auxiliary Register(装载辅助寄存器1 2常数装入指定的AR,短立即数1 2常数装入指定的AR,长立即数2 2MAR 修改当前AR和/或ARP,间接(直接时无操作)Modify Auxiliary Register(修改辅助寄存器1 1SAR 存指定的AR至指定位置,直接或间接Store Auxiliary Register(存储辅助寄存器1 1SBRK 从当前AR减去常数,短立即数Subtract Short-ImmediateValue From AuxiliaryRegister(从当前辅助寄存器减去短立即数1 1暂时寄存器(TREG)、乘积寄存器(PREG)和乘法指令助记符指令描述指令的中英文指令字周期APAC PREG加到ACC Add PREG to Accumulator(P寄存器加至累加器1 1LPH 装入PREG高位Load Product Register HighWord(装载乘积寄存器高位1 1LT 装入TREG,直接或间接Load TREG(装载TREG寄存器1 1LTA 装入TREG,累加前次乘积,直接或间接Load TREG and AccumulatePrevious Product(装载TREG寄存器并累加前次乘积1 1LTD 装入TREG,累加前次乘积,搬移数据,直接或间接Load TREG, AccumulatePrevious Product, and MoveData(装载TREG寄存器、累加前次乘积并移动数据1 1LTP 装入TREG,存PREG入ACC,直接或间接Load TREG and Store PREG inAccumulator(装载TREG寄存器并存储PREG寄存器到累计器1 1LTS 装入TREG,减去前次乘积,直接或间接Load TREG and SubtractPrevious Product(装载TREG寄存器并减去前次乘积1 1MAC 乘且累加,直接或间接Multiply and Accumulate(乘且累加2 3MACD 乘且累加,数据转移,直接或间接Multiply and Accumulate WithData Move(乘且累加并带数据移动2 3MPY TREG乘数据值,直接或间接Multiply(乘 1 1TREG乘13-bit常数,短立即数1 1MPYA 乘且累加前次乘积,直接或间接Multiply and AccumulatePrevious Product(乘且累加前次乘积1 1MPYS 乘且减去前次乘积,直接或间接Multiply and Subtract PreviousProduct(乘且减去前次乘积 1 1MPYU 乘无符号数,直接或间接Multiply Unsigned(无符号乘法 1 1 PAC PREG装入ACC Load Accumulator With ProductRegister(将乘积寄存器装入累加器1 1SPAC 从ACC减去PREG Subtract PREG FromAccumulator(从累加器减去PREG寄存器1 1 SPH 存高段PREG,直接或间接Store High PREG(存储PREG 1 1高位SPL 存高段PREG,直接或间接Store Low PREG(存储PREG低位1 1SPM 设置乘积移位方式Set PREG Output ShiftMode(设置PREG移位方式1 1SQRA 平方且累加前次乘积,直接或间接Square Value and AccumulatePrevious Product(平方并累加前次乘积1 1SQRS 平方且减去前次乘积,直接或间接Square Value and SubtractPrevious Product(平方并减去前次乘积1 1转移指令助记符指令描述指令的中英文指令字周期B 无条件转移,间接Branch Unconditionally(无条件转移 2 4 BACC 转移至ACC指定的地址Branch to Location Specified byAccumulator(按累加器内容转移1 4BANZ 当前AR非0时转移,间接;判断(AR,(AR-1→(ARBranch on Auxiliary Register NotZero(当前辅助寄存器不等于零转移 2 4BCND 条件转移Branch Conditionally(条件转移 2 4CALA 调用ACC指定位置的子程序,间接Call Subroutine at Location Specifiedby Accumulator(调用累加器低16位指定地址处的子程序2 4CALL 调用子程序,间接Call Unconditionally(无条件调用指令2 4 CC 条件调用Call Conditionally(条件转移指令 2 4 INTR 软中断Software Interrupt(软中断 1 4NMI 不可禁止的中断Nonmaskable Interrupt(不可屏蔽中断转移到程序存储器1 4 RET 从子程序返回Return From Subroutine(子程序返回 1 4 RETC 条件返回Return Conditionally(条件返回 1 4 TRAP 软件中断Software Interrupt(软件陷阱中断 1 4 控制指令助记符指令描述指令的中英文指令字周期BIT 位测试,直接或间接Test Bit(位测试 1BITT 由TREG指定的位测试,直接或间接Test Bit Specified byTREG(测试TREG寄存器规定的位1CLRC 清除C位Clear Control Bit(状态位清零1清除INTM位 1 1 清除OVM位 1 1 清除SXM位 1 1 清除TC位 1 1 清除XF位 1 1IDLE 停止执行,直至中断Idle Until Interrupt(空闲直至中断发生1LDP 装入数据页指针,直接或间接Load Data PagePointer(装载数据页指针 1装入数据页指针,短立即数1 2LST 装入状态寄存器ST0,直接或间接Load Status Register(装载状态寄存器1装入状态寄存器ST0,直接或间接1 2NOP 无操作No Operation(空操作 1POP 将堆栈顶弹出至ACC低段Pop Top of Stack to Low Accumulator(栈顶弹出至累加器的低位1POPD 将堆栈顶弹出至数据存储器,直接或间接Pop Top of Stack to DataMemory(栈顶弹出至数据存储器1PSHD 将数据存储器的值压入堆栈,直接或间接Push Data-Memory ValueOnto Stack(数据存储器值进栈1PUSH 将ACC低段压入堆栈Push Low AccumulatorOnto Stack(累加器低位进栈1RPT 重复执行下一条指令,直接或间接Repeat NextInstruction(重复执行下条指令1重复执行下一条指令,短立即数1 1SETC 设置SXM位Set Control Bit(置位 1 设置TC位 1 1设置XF位 1 1设置C位 1 1设置CNF位 1 1设置INTM位 1 1设置OVM位 1 1SPM 设置乘积移位模式Set PREG Output ShiftMode(设置PREG移位输出方式1SST 存状态寄存器ST0,直接或间接Store Status Register(存储状态寄存器1存状态寄存器ST1,直接或间接1 1I/O和存储器指令助记符指令描述指令的中英文指令字周期BLDD 数据块从数据存储器搬移至数据存储器,直接或间接,长立即数作源存储器地址Block Move From Data Memory toData Memory(数据存储器到数据存储器的块传送2 3BLPD 数据块从程序存储器搬移至数据存储器,直接或间接,长立即数作源存储器地址Block Move From Program Memoryto Data Memory(程序存储器到数据存储器的块传2 3DMOV 数据在数据存储器中搬移,直接或间接Data Move in Data Memory(在数据存储器内传送数据1 1IN 从I/O输入数据,直接或间接Input Data From Port(端口地址送数据地址总线2 2OUT 输出数据至口,直接或间接Output Data to Port(端口地址送数据地址总线2 3SPLK 存长立即数至数据存储器,直接或间接Store Long-Immediate Value to DataMemory(存储长立即数值至数据存储器2 2TBLR 读数据表,直接或间接Table Read(读表 1 3TBLW 写数据表,直接或间接 Table Write(写数据表 1 31. 指令格式(即语法)不带进位加法指令格式: ADD dma [,shift] ;直接寻址 ADD dma ,16 ;16位左移直接寻址 ADD ind [,shift [,ARn ] ] ;间接寻址 ADD ind ,16[,ARn ] ;16位左移的间接寻址 ADD #k ;短立即寻址ADD #lk [,shift ] ;长立即寻址2.操作数dma;直接寻址时,数据存储器地址低7位shift:;左移值从0 到 15(默认值为0)n;指示下一个辅助寄存器n= 0~ 7 k: ;8位短立即数值lk: ;16位短立即数值ind;选择下列7种间接寻址方式中的一种* *+ *- *0+ *0- *BR0+ *BR0-3.操作码.执行4(1 (Smem+(src→src(2 (Smem<<(TS)+(src)→src(3 (Smem<<16+(src)→dst(4 (Smem[ <<SHIFT]+(src)→dst(5 (Xmem <<SHIFT+(src)→src(6( (Xmem+ (Ymem <<16→dst(7 lk<<SHFT+(src)→dst(8 lk<<16+(src)→dst(9 (src or[dst]+(src)<<SHIFT→dst(10 (src or[dst]+(src)<<ASM→dst5.状态位指令执行受SXM和OVM的影响,指令执行结果影响C和OV 6.说明把一个16位的数加到选定的累加器中,或一个采用双数据存储器操作数寻址的操作数Xmen。
DSP指令大全(最全)附录6 TMS320C54x 指令系统一览表(按指令功能排列) 一、算术运算指令二、逻辑运算指令三、程序控制指令6.注:?条件―真‖,§条件―假‖,※延迟指令。
四、加载和存储指令4.6.7.五.伪指令2.初始化常数(数据和存储器)的伪指令3.调整段程序计数器伪指令(SPC).align 把SPC调整到页边界.even 把SPC调整到偶数字边界4.控制输出列表格式化伪指令5.条件汇编伪指令.break [well-defined expression] 如果条件真结束.loop汇编,.break结构是可选项.else 如果.if条件为假,汇编代码块.else结构是可选项.elseif well-defined expression——如果if条件为假且.elseif 条件为真,汇编代码块.else结构是可选项.endif 结束.if代码块.endloop 结束.1oop代码块.if well-defined expression 如果条件为真则汇编代码块.loop [well-defined expression] 开始代码块的重复汇编6. 汇编符号.asg [”] character string [”],substitution symbol——把字符串赋予替代的符号..endstruct 结束结构定义.equ 使值和符号相等.eval well-defined expression,substitution symbol 根据数字替代符号完成运算.newblock 取消局部标号.set 使数值和符号相等.struct 开始结构定义.tag 把结构属性赋予标号7.宏指令宏定义:Macname .macro[参数1],[…],[参数n]宏调用:[标号][:] macname [参数1],[…],[参数n]8.编译软件指令①汇编器:asm500.exeasm500[input file[object file [listing file] [-options]]-c—使汇编语言文件中大小没有区别。
汇编指令集本节根据指令的功能来分,提供六张表来说明指令集的概况:累加器、算数和逻辑指令(表2);辅助寄存器和数据页指针指令(表3);TREG、PREG和乘法指令(表4);转移指令(表5);控制指令(表6);I/O和存储器操作(表7)。
在每张表中,指令按字母顺序排列。
执行每条指令所需要的周期数在表中给出,所有指令都假设从内部程序存储器和内部数据存储器中执行,指令的周期数适用于单指令执行,不适用于重复方式。
编程时,用户必须对每条指令的寻址方式了解清楚,因此这里也在表中给出了每条指令的寻址方式。
由于指令的操作码对用户编程没有多大指导意义,在这里就没有列出来。
为了参照起见,我们先定义这六张概述表的符号意义:ACC 累加器。
ARBITXCM 辅助寄存器。
4位数值,用于指定数据存储器数值中的哪一位将被BIT指令所测试。
2位数值,CMPR指令执行CM值所声明的比较:若CM=00,测试当前AR=AR0否;若CM=01,测试当前AR<AR0否;若CM=10,测试当前AR>AR0否;若CM=11,测试当前AR≠AR0否。
ShiftTP 4位右移量。
用于条件执行指令的2位数值,代表如下4种条件:若BIO引脚为低,TP=00;若TC位=1,TP=01;若TC位=0,TP=10;无条件TP=11。
ARX 用于LAR和SAR指令的3位数据值,指定被操作的辅助寄存器。
52表2 累加器、算数和逻辑指令 ABS周期|(ACC)|→ACC 1(ACC)+(数据存储器地址)×12shift→ACC(ACC)+(数据存储器地址)×216→ACC 1(ACC)+k→ACC 1shift(ACC)+lk×2→ACC 2指令功能(ACC)+(数据存储器地址)+(C)→ACC寻址方式直接/间接直接/间接短立即数长立即数指令说明ACC取绝对值移位时低位填0,若SXM=1,高位用符号扩展;若SXM=0,高位填0;结果存在ACC中,该指令使C=0。
寻址短立即数时,加操作不受SXM的影响,且不能重复执行。
ADDADDC 1直接/间接该指令抑制符号扩展该指令抑制符号扩展;无论SXM为何值,数据均作无符号16位数看待。
当SXM=0和直接/间接移位次数等于0时,ADDS与ADD指令结果相同。
被寻址的数据寄存器单元的内容左移并加直接/间接到ACC,移位次数由TREG的低4位确定,SXM位的值控制移位时是否作符号扩展。
使用直接/间接寻址,ACC的低位字与数据直接/间接存储器单元的值作与运算,结果存在ACC的低字,ACC的高位字清0。
使用立即数寻址,长立即数可以左移,移位时,32位中长立即数未被长立即操作数填充的位均被清零。
长立即数累加器中的内容用其逻辑反取代指定的数据存储器单元的内容或16位常数直接/间接左移并加载到ACC,低位填0,若SXM= 1,高位用符号位扩展;若SXM=0,则填直接/间接0。
长立即数指定的数据存储器单元的内容或用0扩展直接/间接的8位常数左移并加载到ACC的低16位, ACC的高位填0。
数据作为16位无符号数短立即数处理,无论SXM为何值,本指令都不进行符号扩展。
将数据存储器单元的内容左移后加载到直接/间接ACC。
左移位数由TREG的低4位确定。
SXM的值决定ACC高位是否符号扩展。
将ACC的内容换成其相反数。
当对0000h作NEG操作时,OV置1。
若OVM=1,ACC=7FFFh,若OVM=0,则ACC=8000 0000h,只要ACC不等于0则C=0,当ACC=0,则C=1。
NORM指令将ACC中的有符号数进行规格化。
对定点数进行规格化即将其分成指数和尾数,为此对位31和位30作异或运算间接即可确定位30是数值还是符号。
对当前AR的缺省修改方式是加1。
该指令对正、负二进制补码均适用。
由于该指令在流水53ADDS(ACC)+(数据存储器地址)→ACC (ACC)+(数据存储器地址)左移(TREG(3:0))位→ACC(15:0)1ADDT 1ANDCMPLLACCLACL1(ACC(15:0))AND (数据存储器地址)→ACC(15:0)0→ACC(31:16)shift(ACC(31:16))AND lk ×2→ACC216(ACC(31:16))AND lk ×2→ACC(ACC)的逻辑反→ACC 1shift(数据存储器地址)×2→1ACC16(数据存储器地址)×2→ACC 1shift位→ACC lk×22(数据存储器地址)→ACC(15:0)10→ACC(31:16)k→ACC(7:0)10→ACC(31:16)(数据存储器地址)左移TREG(3:0)位→ACC(15:0)1LACTNEG (ACC)×(-1)→ACC 1NORM若(ACC)=0,则TC→1;否则若(ACC(31))XOR(ACC(30))=0,则TC→0,(ACC)×2 →ACC按指定的方式修改AR否则TC→11OR(ACC(15:0))OR (数据存储器地址)→ACC(15:0)(ACC(31:16))→ACC(31:16)(ACC)OR lk×2shift16→ACC(ACC)OR lk×2→ACC (ACC(31))→C(ACC(30:0))→ACC(31:1)C→ACC(0)C→ACC(31)(ACC(31:1))→A CC((30:0))(ACC(0))→C ((ACC)×2)的高16位→数据存储器地址((ACC)×2)的低16位→数据存储器地址(ACC(31))→C(ACC(30:0))→ACC(31:1)0→ACC(0)若SXM=0,则0→ACC(31)若SXM=1,则ACC(31)→ACC(31)(ACC(31:1))→ACC(30:0)(ACC(0))→Cshiftshift线的第4阶段才完成对AR的操作,而其它指令在流水线的第2阶段完成对AR 的操作,因此紧跟在NORM指令后的两条指令不能对AR值或者ARP值进行修改。
否则NORM指令将不能操作正确的数据存储器单元。
ACC的内容和被寻址的数据地址单元的值或左移后的立即数作或操作,SXM位对OR1直接/间接指令没有影响。
数据操作数没有被占用的位总是填0。
因此在直接或间接寻址或不2长立即数移位的长立即数的情况下ACC的高位是不变的。
当操作数是立即数且移位次数不等2长立即数于0时,操作数左移低位补0。
将ACC内容左移一位,进位位被移入最低位,最高位被移入进位位。
将ACC内容右移一位,进位位被移入最高位,最低位被移入进位位。
ROL1ROR1SACHSACH将整个ACC的32位数左移0-7位,将1直接/间接移位后数值的高16SACH将整个ACC的32位数左移0-7位,将1直接/间接移位后数值的低16 1 1SFL指令使ACC的内容左移一位,ACC的最低位填0,最高位移入进位位C。
SFR指令将ACC的内容右移一位。
若SXM=1,则产生算数右移,ACC的符号位不变,位31复制到位30,位0移入进位位。
若SXM=0,则产生逻辑右移,ACC的所有内容右移一位,位0移入进位位,位31填0 在直接间接和长立即数寻址方式里被寻址的数据存储单元的内容或16位常数左移,然后累加器减去移位后的值。
移位时低位填0。
高位扩展与否由SXM当使用短立即数时累加器减去8位正常数。
此时不可以指定移位值,减法不受SXM的影响,并且是不可重复的。
通常情况下,若减法结果有借位则进位位清0;若减法结果没有借位,则进位位置1。
但若移位次数为16,则当减法结果有借位时进位位清0,减法不产生借位时,进位位不变。
ACC的值减去被寻址的数据寄存单元的内容及进位位的逻辑反值,抑制符号扩展。
若相减结果产生借位进位位清0;若没有借位则进位位置1。
ACC实现条件减,可用于除法:把16位的54SACLSFLSFR(ACC)-(数据存储器地址)×2→ACC(ACC)-(数据存储器地址)×SUB2→ACC (ACC)-k→ACC (ACC)-lk×2shift16shift→ACC1 1 1 2直接/间接直接/间接短立即数长立即数SUBB SUBC(ACC)-(数据寄存器地址)-(C的逻辑反)→ACC 11直接/间接直接/间接若(ACC)>=0 且(数据存储器地址)>=0(ACC)-(数据寄存器地址)×2→ALU输出。
若ALU输出>=0,则(ALU输出)×2+1→ACC否则(ACC)×2→ACC15SUBS1ACCACC)-((数据寄存器地址)×SUBT2 →ACC 若SXM=1,则(数据存储单元)用符号扩展若SXM=0,则(数据存储单元)不用符号扩展ACC(15:0))XOR(数据寄存器地址)→ACC(15:0)(ACC(31:1))→ACC(31:16)或(ACC(31:0))XOR lk×2shift(TREG(3:0))1正被除数放在ACC的低16位,ACC的高位清0;16位的正除数放在数据存储单元中。
执行SUBC指令16次。
;最后一次SUBC指令完成后ACC的低16位是除数的商,ACC的高16为是余数。
若ACC和存储单元的内容为负,则不能用SUBC实现除法。
若16位被除数的有效数字少于16位可将它放在ACC中并左移,左移的位数为前面非有效的0的个数,SUBC指令执行的次数为16减去移位次数。
执行该指令不会因正溢或负溢而饱和。
ACC减去数据存储单元的内容,抑制符号扩展。
不管SXM为何值,数据存储单元的直接/间接内容都作为无符号处理。
ACC还是作为有符号数。
若相减结果有借位清0,若没有借位C置1。
ACC减去左移后的数据存储单元的内容,移位次数由TREG的低4位确定。
SXM控制是否对直接/间接数据存储单元的内容作符号扩展。
XOR→ACC(31:0)16ZALR或(ACC(31:0))XOR lk×2→ACC(31:0)(数据存储器地址)→ACC(31:16)8000h→ACC(15:0)直接和间接寻址时ACC的低16位和被寻址的数据存储单元的内容作异或运算,结果存在ACC的低16位,ACC的高16位不变。
使用长立即数寻址时,长立即数左移,数1直接/间接据操作数没有占用的位填0,然后和ACC 中的32位数作异或运算。
2长立即数1数据存储单元的内容送到ACC的高16位,直接/间接ACC的低15位清0,第15位置1。
55表3 辅助寄存器指令 ADRK指令功能(当前AR)+k→当前AR 若(当前AR)≠ 0,则操作数→PC 否则(PC)+2→PC 按指令要求的方式修改(当前AR)和(ARP)(当前AR)与(AR0)比较,并把结果放在状态寄存器ST1的TC位(数据存储器地址)→ARxk→ARx lk→ARx 按指令指定的方式修改(当前AR)和(ARP)(ARx)→数据寄存器地址(当前AR)-K→当前AR周寻址方式指令说明 8位立即数按右对齐方式与当前辅助寄存器1值相加。