6)CM=10,测试是否当前AR>AR0;
7)CM=11,测试是否当前AR≠AR0。
8)AR-辅助寄存器
9)BITX-4位数值,表示BIT指令要测试数据存储器值的哪一位
10)SHIFT-4位移位值
11)TP-条件执行指令的2位数值:
12)BIO引脚为低,TP=00;
13)TC=1,TP=01;
14)TC=0,TP=10;
15)无条件,TP=11。
2TMS320LF240x的汇编指令概述
汇编语言是DSP应用软件的基础,使用汇编语言时必须要符合规定的格式,只有这样汇编器才能将源文件转换为机器语言的目标文件。
2.1汇编语言源程序的标准格式
汇编语句格式一般包含4部分:
1)标号;
2)指令;
3)操作数;
4)注释。
以助记符指令为例,格式如下:
[标号][:
]指令[操作数][;注释]
说明:
其中[]内的内容为可选项。
2.2在编写汇编语句时,必须遵循以下格式:
1)语句必须以标号、空格、星号或分号开始。
2)若使用标号,则必须从第1列开始。
标号长度最多为32个字符,由A-Z、a-z、0-9、_和$等组成,但第1个字符不能为数字。
标号后可以跟一个冒号(:
),但并不作为标号的一部分。
3)每部分必须由1个或多个空格分开。
4)开始于第1列的注释须用星号(*)或分号(;)标示,但在其他列开始的注释前面只能用分号。
5)指令一定不能从第1列开始,否则将被视为标号。
指令包括助记符指令、汇编伪指令(如.data,.set)、宏伪指令(如.macro)和宏调用。
6)操作数可以为列表形式,汇编器允许使用常数、符号或表达式作为地址、立即数或间接寻址。
当操作数为立即数时,使用#号作为前缀;操作数为间接寻址时,使用*号作为前缀,将操作数的内容作为地址。
2.3汇编语言的指令集
TMS320LF240x的汇编语言共87条,分为6大类:
1)累加器、算术和逻辑指令;
2)辅助寄存器和数据页指针指令;
3)TREG、PREG和乘法指令;
4)跳转指令;
5)控制指令;
6)I/O和存储器操作指令。
2.4汇编指令的语法和说明
在介绍汇编指令之前,先把所用到的操作数做统一规定:
1)dma:
数据存储器地址的低7位(LSB);
2)shift:
左移位数0~15;
3)n:
指定下一次的辅助寄存器ARP值(0~7);
4)k:
8位短立即数;
5)1k:
16位长立即数;
6)ind:
是一个间接寻址变量,可取*、*+、*-、*0+、*0-、
*BR0+、*BR0-;
7)Pma:
16位程序存储器地址;
8)PA:
16位I/O端口或I/O映射寄存器地址。
2.5存储器寻址方式
存储器寻址方式包括立即寻址、直接寻址和间接寻址。
1)立即寻址
含义:
指令中已包含有执行指令所需的操作数;
说明:
①在数值或符号前加‘#’表示立即数;
②两种形式:
短立即数(8/9/13位)和长立即数(16位)。
例如:
①采用短立即寻址RPT指令(详见3.61项)(#后的最大值为255)
RPT#99;将紧跟在后面的语句重复99+1次
②采用长立即寻址ADD指令
ADD#65534,2;将数据65534左移两位后,再将结果加至;累加器
2)直接寻址
含义:
用指令中包含的数据存储器地址的低7位+基地址
→16位数据存储器地址。
基地址:
DP__数据页指针(ST0低9位)
指令寄存器的内容:
位15~8:
指示指令类型(操作码)和指令所访问的数据值的移位信息。
位7:
直接/间接指示符。
0-直接寻址;1-间接寻址。
位6~0:
指示指令访问的数据存储器的偏移量。
16位地址:
步骤:
①设置数据页面:
将适当的值(0~511)加载到DP。
可利用LDP或任何能将数值加载到ST0的指令。
②指定偏移地址:
给出7位偏移地址作为指令的操作数。
注:
不必在每条使用直接寻址的指令前都设置数据页面。
如果代码块内的所有指令都访问同一数据页面(128字),只须在该指令块的前面加载一个DP。
必须保证在访问新的数据页面前改变DP。
例:
①使用直接寻址的ADD指令
LDP#4;将数据页面设置为4
ADD9h,5;数据存储器地址0209h中的内容左移5位与累;加器的内容相加
②使用直接寻址的ADDC指令
LDP#500;将数据页面设置为500
ADDC6h;数据存储器地址FA06h中的内容及进位位
;(C)的值与累加器的内容相加
3)间接寻址
含义:
按辅助寄存器(AR)中的内容寻址数据存储器
用途:
主要用在需要存储器地址以步进方式连续变化的场合。
说明:
①当前辅助寄存器
通过向状态寄存器ST0中的3位辅助寄存器指针(ARP)在装入0~7,可选择特定的辅助寄存器。
ARP可由MAR、LST或任何支持间接寻址的指令装载。
ARP所指的寄存器被作为当前寄存器(AR)。
执行指令是,当前AR的内容用作被访问的数据存储器地址。
②间接寻址选项
不加也不减:
指令使用当前AR的内容作为数据存储器的地址,但当前AR的内容既不增加也不减少。
加1或减1:
指令使用当前AR的内容作为数据存储器的地址,但当前AR的内容加1或减1。
加或减一个变址量:
指令使用当前AR的内容作为数据存储器的地址,然后使当前AR的内容加或减一个变址量,该变址量为AR0中的值。
加或减一个变址量且反向进位:
指令使用当前AR的内容作为数据存储器的地址,然后使当前AR的内容加或减一个变址量,该变址量为AR0中的值,采用反向进位方式(用于FFT)。
选项
操作数
例子
不增不减
*
LACC*;用当前AR所指的DM地址中的内容装载累加器
增1
*+
LACC*+;用当前AR所指的DM地址中的内容装载累加器然后
;当前AR加1
减1
*-
LACC*-;用当前AR所指的DM地址中的内容装载累加器然后
;当前AR减1
加变址量
*0+
LACC*0+;用当前AR所指的DM地址中的内容装载累加器然后
;当前AR的内容加上AR0的内容
减变址量
*0-
LACC*0-;用当前AR所指的DM地址中的内容装载累加器然后
;当前AR的内容减去AR0的内容。
加变址量反向进位
*BRO+
LACC*BRO+;用当前AR所指的DM地址中的内容装载累加器然后
;当前AR的内容加上AR0的内容,采用反转进位。
减变址量反向进位
*BRO-
LACC*BRO-;用当前AR所指的DM地址中的内容装载累加器然后
;当前AR的内容减去AR0的内容,采用反转进位。
③辅助寄存器
除了更新当前AR内容外,某些指令还可以指明下一个AR。
例:
MAR*,AR1;将当前AR设为AR1
LACL*+,AR2;将AR1所指向的地址中的内容装载到;ACC加器的低16位,AR1内容加1,使;AR2为当前AR
SACL*+;将ACC的低16位存于AR2所指向的地址;单元,AR2内容加1
④间接寻址操作码格式
指令寄存器的内容:
位15~8:
指定指令类型及与数据移位相关的信息。
位7:
直接/间接指示。
1为间接寻址方式,0为直接寻址方式。
位6~4:
AR更新代码ARU,确定是否对AR进行更新以及将其增加还是减少将ACC的低16位存于AR2所指向的地址。
位3:
下一AR指示符N。
指定该指令是否改变ARP的值,0-ARP内容不变;1-NAR的内容加载到ARP,原ARP的值加载到ST1的ARB。
位2~0:
下一AR的值NAR。
ARU代码
在当前AR中完成的运算
6
5
4
0
0
0
在当前AR中无操作
0
0
1
当前AR-1->当前AR
0
1
0
当前AR+1->当前AR
0
1
1
保留
1
0
0
前AR-AR0->当前AR(反向进位)
1
0
1
当前AR-AR0->当前AR
1
1
0
当前AR+AR0->当前AR
1
1
1
当前AR+AR0->当前AR(反向进位)
⑤修改辅助寄存器的内容
特定指令:
LAR、ADRK、SBRK和MAR。
LAR:
装载AR;
ADRK:
从AR中加上一个立即数;
SBRK:
从AR中减去一个立即数;
MAR:
使AR值增加/减少1或增加/减少一个索引量。
例:
①不加也不减的间接寻址指令
ADD*,8;将当前AR指定的DM单元的值向左移8位后加到ACC中
例:
②加1的间接寻址指令
ADD*+,8,AR4;将当前AR指定的DM单元的值向左移8位后加到;ACC中,当前AR加1,且AR4变为下一AR
3汇编指令集
3.1ABS累加器取绝对值
语法:
ABS
说明:
计算ACC的绝对值,进位位C置0。
指令受OVM状态标志位的影响,执行结果影响C和OV。
如果ACC的内容大于或等于0,执行指令后其内容不变;若累加器内容小于0,执行指令后用其对2的补码数(即它的绝对值)取代原来的值。
ACC=80000000h时为特殊情况,若OVM=0,对80000000h取绝对值(执行ABS指令)的结果是80000000h;若OVM=1,对80000000h取绝对值的结果是7FFFFFFFh,无论哪种情况下,状态位OV都置1。
例如:
ABS;(OVM=0)
3.2ADD累加器加
ADD指令执行的操作是将数据存储器单元的数或立即数左移后加至累加器(移位时受SXM影响)。
结果存在累加器中。
寻址短立即数时,加操作不受SXM的影响,且不能重复执行,不支持移位。
语法:
ADDdma[,shift];shift=0~16直接寻址
ADDdma,16左移16位直接寻址
ADDind[,shift[,ARn]]间接寻址
ADDind,16[,ARn]左移16位间接寻址
ADD#k;8位短立即数短立即数寻址
ADD#1k[,shift]长立即数寻址
说明:
被寻址的数据单元的内容或一个立即数左移后加到累加器,在移位时低位填0。
如果SXM=1,则高位进行符号扩展;如果SXM=0,则高位填0。
如果采用间接寻址并更新ARP的值,此时必须指定一个shift(移位)操作数。
如果不希望产生移位,则将0作为操作数,例如ADD*+,0,AR2。
通常,如果相加的结果产生进位时,C=1;不产生进位时,C=0。
但是,当左移16位进行相加时,如果相加的结果产生进位,则C=1;不产生进位时,则C不受影响。
这样,在把32位数加到累加器时,可使累加器产生正确的符号进位。
1)ADD1,1;DP=6:
地址0300h-037Fh
2)ADD*+,0,AR0
3)ADD#1h;加短立即数
4)ADD#1111h,2;长立即数1111h左移2位后与ACC相加, ;结果存在ACC
执行前
执行后
ACC
x
2h
ACC
0
4446h
C
C
3.3ADDC带进位的累加器加
语法:
ADDCdma直接寻址
ADDCind[,ARn]间接寻址
说明:
将数据存储单元的内容和进位位C的值加到累加器中,符号不扩展,进位位受正常方式影响。
指令受OVM位影响,执行指令的结果影响C和OV。
1)ADDC0;DP=6:
地址0300h-037Fh
2)ADDC*-,AR4;OVM=0
3.4ADDS符号扩展抑制的累加器加
语法:
ADDSdma 直接寻址
ADDSind[,ARn]间接寻址
说明:
将被寻址的数据单元中的内容加到累加器,抑制符号扩展。
无论SXM为何值,数据存储单元中的数据均被看作一个无符号的16位数。
ADDS指令产生的结果与SXM=0、移位数为0的ADD指令产生的结果相同,若相加结果产生进位时C=1;否则C=0。
1)ADDS0;DP=6:
地址0300h-037Fh
2)ADDS*
3.5ADDTTREG指定移位的累加器加
语法:
ADDTdma直接寻址
ADDTind[,ARn]间接寻址
说明:
将数据存储单元的内容左移后加到累加器中,左移的位数由TREG的低4位(0-15)确定。
数据存储单元中数据的符号扩展受SXM控制。
指令受SXM和OVM位影响,执行结果影响C和OV。
1)ADDT127;DP=4:
地址0200h-027Fh;SXM=0
2)ADDT*-,AR4;SXM=0
3.6ADRK辅助寄存器加短立即数
语法:
ADRK#k短立即数寻址
说明:
8位正整数按右对齐方式加到当前辅助寄存器中,当前辅助寄存器由ARP指定。
对辅助寄存器的所有运算都是无符号数运算。
例子:
ADRK#80h
3.7AND和累加器进行与操作
语法:
ANDdma直接寻址
ANDind[,ARn]间接寻址
AND#1k[,shift]长立即数寻址
AND#1k,16左移16位的长立即数寻址
说明:
如果是直接或间接寻址,数据存储单元中的数和累加器的低16位进行与运算,结构放在累加器的低16位,累加器的高16位清0。
如果是立即数寻址,长立即数可以被左移,没有被移位数填满的高位和低位均填0,移位结果与累加器的内容逻辑与。
指令不受SXM位影响。
【例1】AND#00FFh,4
【例2】AND16;DP=4:
地址0200h-027Fh
【例3】AND*
3.8APACPREG加到累加器
语法:
APAC
说明:
PREG寄存器的内容移位后加到累加器,移位的位数由状态寄存器ST1中的PM位确定。
指令不受SXM位影响,PREG总是进行符号扩展。
指令受PM和OVM位影响,结果影响C和OV。
【例3-31】APAC;PM=01
3.9B无条件跳转
语法:
Bpma[,ind[,ARn]]间接寻址
说明:
程序跳转到pma指定的地址,并根据指令修改当前辅助寄存器(AR)和ARP。
pma值既可以是一个符号,也可是一个数字地址。
【例3-32】B191,*+,AR1
将191加载到程序计数器,并且程序从该地址继续执行,当前辅助寄存器加1,并且ARP被设置为指向辅助寄存器1(AR1)。
3.10BACC跳转到累加器指定的地址
语法:
BACC
说明:
程序跳转到累加器低16位所指定的地址。
【例3-33】BACC;ACC低16位为191
将数值191加到程序计数器,并且程序从该地址继续执行。
3.11BANZ辅助寄存器非0跳转
语法:
BANZpma[,ind[,ARn]]间接寻址
说明:
如果当前辅助寄存器的值(AR)不为0,则程序跳转到pma指定的地址,否则执行下一条指令。
根据指令修改当前辅助寄存器(AR)和ARP。
缺省时,当前辅助寄存器减1。
该指令常用于控制循环体的执行,如果要使循环体执行N次,则可在循环体执行前将用于计数的辅助寄存器初始化为N-1。
pma值既可以是一个符号,也可以是一个数字地址。
【例3-34】BANZPGM0;PGM0为标号
因为AR0的内容不为0,则PGM0给定的地址加载到程序计数器(PC),程序从该处运行。
对当前AR减1,变为4h。
因为AR0的内容为0,所以不跳转,而是将PC加2,即继续执行BANZ后面的指令。
当前AR减1,变为FFFFh。
【例3-35】编制一个循环体程序,将数据存储单元0060h-0063h的内容加到累加器中。
MAR*,AR0