第3章 TMS320LF240X寻址方式和指令系统 TMS320LF240X指令系统中的绝大多数指令都可以在单周期内完成。少数指令需两个周期,这些指令主要是操作数涉及16位长立即数的指令或控制转移指令。个别复杂的混合运算需3个周期,如MAC指令(乘及累加指令)。无延时的最长指令周期为4个机器周期,主要有子程序返回且涉及片外存储器的指令。 3.1 TMS320LF240X的寻址方式 TMS320LF240X系列DSP的寻址方式主要有3种: 立即寻址方式、直接寻址方式和间接寻址方式,其中立即寻址方式有短立即数和长立即数两种,直接寻址和间接寻址均可访问数据存储器。 3.1.1 立即寻址方式 TMS320LF240X支持两种立即寻址方式: 单字(8位、9位或13位常数)短立即寻址和双字(16位常数)长立即寻址。在短立即数指令中,立即操作数包含在这个指令字中。在长立即数指令中,指令码的第二个指令字为立即操作数,这个数值可以是一个绝对值,也可以是2的补码值。立即寻址的指令字格式为: 短立即寻址(单字): 1514131211109876543210操作码8、9或13位常数 长立即寻址(双字): 1514131211109876543210操作码16位常数 TMS320LF240X系列指令系统中能进行立即寻址的指令是有限的。TMS320LF240X支持立即寻址的指令如下。 8位立即寻址: ADD,ADRK,LACL,LAR,RPT,SBRK,SUB. 9位立即寻址: LDP. 13位立即寻址: MPY. 16位立即寻址: ADD,AND,LACC,LALK,MPY,OR,RPT,SBLK,SUB, XOR. 立即寻址方式汇编语言的指令格式是: \标号>\] 指令助记符 \常数>\]例1 使用短立即数寻址方式的RPT指令。 RPT #99 ;将RPT后面的那条指令执行100次这条RPT指令只需1个指令字,其内容为图3.1所示的值。 图3.1 例1指令寄存器中的内容 例2 使用长立即数寻址方式的ADD指令。 ADD #16384,2 ;将数值16384左移两位后与累加器内容相加,结果在累加器中TMS320LF240X DSP原理及应用第3章 TMS320LF240X寻址方式和指令系统这条ADD指令需两个指令字,立即数包含在第二个指令字中,指令寄存器连续接收两个16位值,如图3.2所示。 图3.2 例2连续加载到指令寄存器的内容 3.1.2 直接寻址方式 采用直接寻址方式,可以访问128个字的块内数据存储器,把这128个字构成的块称为数据页面。整个64K数据存储器包含512个数据页面,记为0~511,如图3.3所示。当前数据页面由状态寄存器ST0内的9位数据页面指针(DP)寄存器中的值确定。 在直接寻址方式里,指令寄存器(IR)的格式为: 15141312111098765432108MSBs07LSBs 其中: 8~15位是指令类型的操作码,第7位为0表示该指令为直接寻址方式,0~6位指出指令所访问的数据存储器地址的偏移量。直接寻址方式下,由指令提供数据存储器地址的低7位和数据存储器的页面指针(DP)寄存器的9位形成一个完整的16位数据存储器地址,如图3.4所示。 图3.3 数据存储器的页面 图3.4 直接寻址方式下数据存储器地址的产生 DP指示数据存储器512页中的某一页,而指令中的7位地址则指出一页128个字中的特定位置。可利用LDP(装入数据页面指针)指令或任何能将数值加载到ST0的指令来装入DP寄存器的值。LDP指令直接加载DP,不影响ST0的其他位,该指令可明确指出加载到DP的值。例如,把当前数据页面设置为32(地址为1000H~107FH),可使用如下指令: LDP #32 ;初始化数据页面指针值得注意的是,DP 寄存器在复位时没有初始化,其中的值为随机数,因此在访问数据存储器之前必须对DP寄存器进行初始化。另外,不必在每条使用直接寻址的指令前都设置数据页面。如果代码块内的所有指令都访问同一数据页面,则只需在该块的前面简单地加载一次DP。然而,若代码块中要访问不同的数据页面,则每当访问新的数据页面时都需要正确地改变DP的值。 直接寻址方式的指令格式是: \标号>\] 指令助记符 \移位>\]其中: 0<dma<127。操作数按直接寻址方式取得,先进行预定的位移再操作。位数包含在操作码中。 下面是几个直接寻址方式的例子。 例3 使用直接寻址的ADD(移位数0~15)指令。 LDP #4 ;将数据页面设置为4 ADD 9H,5 ;数据存储器地址0209H中的内容左移5位加至累加器例3中的第1条指令是将(000000100) 装入DP,把当前数据页面设置为4。然后,ADD指令指示一个数据存储器地址,在执行ADD指令之前,该操作码被装入指令寄存器(IR),其移位值嵌套在指令字中。DP和指令寄存器的低7位一起形成一个完整的16位地址0000001000001001(0209H),如图3.5所示。 图3.5 16位数据存储器地址0209H 例4 使用直接寻址的ADD(移位位数16)指令。 LDP #5 ;将数据页面设置为5(地址0280H~02FFH) ADD 9H,16;数据存储器地址0289H中的内容左移16位加至累加器例4中指令寄存器的操作码不仅指出了指令类型,而且还指出移位次数为16位。其数据存储器地址0289H的形式如图3.6所示。 图3.6 16位数据存储器地址0289H 例5 使用直接寻址的ADDC指令。 LDP #500 ;将数据页面设置为500(地址FA00H~FA7FH),数 ADDC 6H ;据存储器地址FA06H中的内容及进位位(C)的值加至累加器例5中不移位,则指令字中高8位全为指令类型操作码,其数据地址FA06H的形式如图3.7所示。 图3.7 16位数据存储器地址FA06H 3.1.3 间接寻址方式 在间接寻址方式下,指令中指定一个辅助寄存器AR,该寄存器包含着操作数的16位数据存储器地址,使用一个辅助寄存器中的16位地址,可以访问64K数据存储空间的任何单元。TMS320LF240X有8个辅助寄存器(AR0~AR7),它提供了灵活多变且功能强大的间接寻址方式。辅助寄存器中的内容可以通过16位符号运算单元--辅助寄存器运算单元(ARAU)完成地址运算,ARAU对AR的运算可以在指令AR之后且在指令执行的同一周期内完成。利用LAR(装入辅助寄存器)指令、ADRK(辅助寄存器加短立即数)指令或SBRK(辅助寄存器减短立即数)指令等来修改辅助寄存器的内容。 为了选择一个特定的辅助寄存器,可将数值0~7装入状态寄存器ST0中的一个3位辅助寄存器指针(ARP)。通过LST指令或MAR指令的主要操作可对ARP进行加载,也可通过支持间接寻址的任何指令的辅助操作实现对ARP 的加载。通常把由 ARP指定的辅助寄存器称做当前辅助寄存器或当前AR。在指令处理期间,当前辅助寄存器的内容用作访问数据存储器的地址。如果指令需要从数据存储器读数据,ARAU将该地址送到数据读地址总线(DRAB),若指令需要向数据存储器写数据,ARAU将该地址送到数据写地址总线(DWAB)。指令使用完该数据值后,ARAU采用16位无符号数的算术运算使当前辅助寄存器的内容增加或减少。 除了更新当前辅助寄存器外,很多指令还可以指定下一个辅助寄存器或称下一个AR。这些指令完成时,它所指定的那个寄存器将成为当前寄存器。允许指定下一个辅助寄存器的指令,向ARP加载一个新值,当ARP装入这个新值时,ARP中先前的值被加载到辅助寄存器指针缓冲器(ARB)中。 TMS320LF240X提供4类间接寻址选项: 不加也不减,加1或减1,加或减一个变址量,按逆向进位方式加或减一个变址量。表3.1列出了用于间接寻址的选项。表3.1 间接寻址操作数操 作操作数说 明不加、不减用当前辅助寄存器AR(由ARP指定)的内容作为数据存储器的地址,但当前辅助寄存器AR的内容既不增加也不减少加1+用当前辅助寄存器AR(由ARP指定)的内容作为数据存储器的地址,并在存储器访问后,将当前辅助寄存器AR的内容加1减1-用当前辅助寄存器AR的内容作为数据存储器的地址,并在存储器访问后,将当前辅助寄存器AR的内容减1加变址量0+用当前辅助寄存器AR的内容作为数据存储器的地址,并在存储器访问后,将当前辅助寄存器AR的内容加上AR0的内容(变址量)减变址量0-用当前辅助寄存器AR的内容作为数据存储器的地址,并在存储器访问后,将当前辅助寄存器AR的内容减去AR0的内容(变址量)逆向进位加变址量BR0+用当前辅助寄存器AR的内容作为数据存储器的地址,并在存储器访问后,按逆向进位方式将当前辅助寄存器AR的内容加上AR0的内容(变址量)逆向进位减变址量BR0-用当前辅助寄存器AR的内容作为数据存储器的地址,并在存储器访问后,按逆向进位方式将当前辅助寄存器AR的内容减去AR0的内容(变址量) 表3.1列出的这些加或减运算均由辅助寄存器算术单元(ARAU)在流水线中指令译码的同一周期内完成。 间接寻址可用于除立即操作数和无操作数指令以外的任何指令,其指令字格式为: 15141312111098765432108MSBs1ARUNNAR 其中: 8~15位表示指令类型及与数据移位有关的信息;第7位为1表明该指令为间接寻址方式;4~6位是辅助寄存器更新代码,见表3.2;第3位指示下一个辅助寄存器,N=0则ARP的内容保持不变,N=1则NAR的内容将装入ARP,ARP的先前值装到状态寄存器ST1中的辅助寄存器缓冲器(ARB)中;0~2位为下一个辅助寄存器的值。 表3.2 当前辅助寄存器中ARU代码的作用ARU代码D6D5D4在当前AR上完成的算术运算000对当前AR无操作001当前AR-1→当前AR010当前AR+1→当前AR011保留位100当前AR-AR0→当前AR(逆向进位)101当前AR-AR0→当前AR110当前AR+AR0→当前AR111当前AR+AR0→当前AR(逆向进位) 间接寻址方式的指令格式为: \标号>\] 指令助记符 {ind} \移位>\] \下一ARP>\] 其中: ind为间接寻址方式选项。下面举例说明间接寻址方式的使用。 例6 使用(不加也不减)间接寻址的ADD指令。 ADD ,8 ;将当前辅助寄存器指定的数据存储单元的内容左移 ;8位加至累加器,当前辅助寄存器内容不加也不减 ;指令寄存器装入的值如图3.8所示图3.8 指令寄存器装入的值1 例7 使用+(加1)间接寻址的ADD指令。 ADD+,8,AR4 ;操作同例6,但当前辅助寄存器内容加上1,且AR4 ;变为下一辅助寄存器。指令寄存器装入的值如图3.9所示图3.9 指令寄存器装入的值2 例8 使用-(减1)间接寻址的ADD指令。 ADD-,8 ;操作同例6,但当前辅助寄存器内容减1,指令寄存 ;器装入的值为0010100010010XXX例9 使用0+(加变址)间接寻址的ADD指令。 ADD0+,8 ;操作同例6,但当前辅助寄存器内容加上寄存器AR0 ;的内容,指令寄存器装入的值为0010100011100XXX例10 使用0-(减变址)间接寻址的ADD指令。 ADD0-,8;操作同例6,但当前辅助寄存器内容减去寄存器AR0 ;的内容,指令寄存器装入的值为0010100011010XXX例11 使用BR0+(逆向进位加变址)间接寻址的ADD指令 ADDBR0+,8;操作同例6,但当前辅助寄存器内容要按逆向进位方 ;式(从左向右)加上寄存器AR0的内容,指令寄存 ;器装入的值为0010100011000XXX例12 使用BR0-(逆向进位减变址)间接寻址的ADD指令。 ADDBR0-,8;操作同例6,但当前辅助寄存器内容要按逆向进位方 ;式(从左向右)减去寄存器AR0的内容,指令寄存 ;器装入的值为0010100011110XXX3.2 TMS320LF240X的指令系统 TMS320LF240X指令系统的功能很强,除了能完成基本的算术逻辑运算、数据传送、程序控制和I/O之外,还有一些特殊的指令组,用以改进处理器的功能,如扩展精度算术运算(ADDC,SUBB,MPYU,BC,BNC,SC和RC),自适应滤波控制(MPYA,MPYS和ZALR)和I/O(IN和OUT),以及累加器和寄存器运算(SPH,SPL,ADDK,SUBK,ADRK,SBRK,ROL和ROR). DSP内部的状态标识寄存器直接影响数据处理。TMS320LF240X有三种数据处理选择: ALU自动抑制符号扩展,管理溢出或定标乘积累加。这些选择项可通过状态寄存器中的状态位来禁止或允许。这些选择项的功能与一般指令的执行是并行的,不引起附加的机器周期,所以没有额外的时间开销。 符号扩展方式选择项用于决定ALU操作所取的移位数据值是否用符号扩展,SXM状态位控制这一操作。利用SSXM指令置这位为“1”来允许符号扩展,由RSXM指令复位该位为“0”来抑制符号扩展。这一操作影响所有包含移位输入数据值的指令(如ADD,ADDT,ADLK,LACT,LALK,SBLK,SFR,SUB和SUBT). 溢出方式选择项用于使运算溢出的影响减至最小,溢出时迫使累加器饱和为最大正值(或在下溢情况下为最大负值),OVM状态位控制这一操作。溢出方式用SOVM指令置OVM位为“1”来允许,用ROVM指令来禁止。这一特性影响ALU中的所有算术操作。 乘积寄存器移位方式选择项迫使所有乘积在累加之前移位。乘积左移1位可用来删除两个16位符号数相乘后多余的符号位。乘积可左移4位来删除16位数值与13位常数相乘后多余的符号位。乘积移位器也可用于将乘积右移6位,使连续做128次乘积累加而不必担心溢出,这避免了溢出管理的额外操作。移位也可在整数或32位精度操作中被禁止,从而乘积不产生移位,保证了程序的兼容性。这些操作由ST1状态寄存器的PM位值来控制。PM位通过SPM指令来置位。这一特性影响所有使用乘法器的指令(APAC,LAT,LTD,LTP,LTS,MAC,MACD,MPYA,MPYS,PAC,SPAC,SPH,SPL,SQRA和SQRS). TMS320LF240X指令系统按功能可分为以下6类。 (1) 累加器、算术和逻辑指令; (2) 辅助寄存器和数据页面指针指令; (3) T寄存器、P寄存器和乘法指令; (4) 转移指令; (5) 控制指令; (6) 输入/输出和存储器指令。 下面分类介绍指令系统的描述及功能。 3.2.1 累加器、算术和逻辑指令 累加器、算术和逻辑指令主要以累加器(ACC)为目的操作数,它是一种最基本、最主要的操作之一。它包括累加器加法指令、减法指令、逻辑运算指令、移位指令和装载保存指令等。表3.3列出了这类指令的助记符、功能说明、所占字数、周期数和操作码。这类指令的详细描述如下。表3.3 累加器、算术和逻辑指令助记符说 明周期ABS累加器(ACC)取绝对值1ADD左移0至15位后加到累加器(直接或间接寻址) 左移0至15位后加到累加器(长立即数寻址) 左移16位后加到累加器(直接或间接寻址) 加到累加器(短立即数寻址)1 2 1 1ADDC带进位加到累加器(直接或间接寻址)1ADDS抑制符号扩展加到累加器(直接或间接寻址)1ADDT由TREG指定移位位数(0~15)加到累加器(直接或间接寻址)1AND数据值和累加器逻辑与(直接或间接寻址) 左移0至15位和累加器逻辑与(长立即数寻址) 左移16位和累加器逻辑与(长立即数寻址)1 2 2CMPL累加器求反(累加器对1求补)1LACC左移0至15位后装入累加器(直接或间接寻址) 左移0至15位后装入累加器(长立即数寻址) 左移16位后装入累加器(直接或间接寻址)1 2 1LACL装载累加器低位字(直接或间接寻址) 装载累加器低位字(短立即数寻址)1 1续表 助记符说 明周期LACT由TREG指定移位位数(0~15)装入累加器(直接或间接寻址)1NEG累加器求负1NORM将ACC中的有符号数进行规格化1OR数据值和累加器逻辑或 (直接或间接寻址) 左移0~15位和累加器逻辑或(长立即数寻址) 左移16位和累加器逻辑或(长立即数寻址)1 2 2ROL累加器逻辑循环左移1ROR累加器逻辑循环右移1SACH左移0~7位后保存累加器高位字(直接或间接寻址)1SACL左移0~7位后保存累加器低位字(直接或间接寻址)1SFL累加器算术左移1SFR累加器算术右移1SUB左移0~15位从累加器中减去(直接或间接寻址) 左移0~15位从累加器中减去(长立即数寻址) 左移16位从累加器中减去(直接或间接寻址) 从累加器中减去(短立即数寻址)1 2 1 1SUBB带借位从累加器减(直接或间接寻址)1SUBC条件减(直接或间接寻址)1SUBS抑制符号扩展从累加器减(直接或间接寻址)1SUBT由TREG指定移位位数(0~15)从累加器减(直接或间接寻址)1XOR数据值和累加器逻辑异或 (直接或间接寻址) 左移0~15位和累加器逻辑异或(长立即数寻址) 左移16位和累加器逻辑异或(长立即数寻址)1 2 2ZALR累加器低位置零并带舍入装载累加器高位11. 累加器加法指令 (1) ADD 加至累加器 句法: ADD dma \ 直接寻址 ADD dma,16 左移16位直接寻址 ADD ind \ARn\]\] 间接寻址 ADD ind,16\ARn\] 左移16位间接寻址 ADD #k 短立即数寻址 ADD #lk\ 长立即数寻址操作数: dma: 数据存储器地址的低7位(7LSB). shift: 左移位数0~15(默认为0). n: 指示下一个辅助寄存器的值0~7. k: 8位短立即数值。 lk: 16位长立即数值。 ind: 选择、+、-、0+、0-、BR0+、BR0-七种选项符号之一。 执行: PC加1,然后…… (ACC)+(数据存储器地址)×2 shift→ACC (ACC)+(数据存储器地址)×216→ACC (ACC)+k→ACC (ACC)+lk×2 shift→ACC 状态位: 受SXM和OVM状态位影响,影响C和OV状态位。 说明: 这组ADD指令的功能是将立即数或被寻址数据存储器单元的内容左移后加到累加器中。移位时,低位填零。若SXM=1,高位用符号扩展,若SXM=0,高位填零,结果存入累加器。当使用短立即数寻址时,加法不受SXM的影响且不可重复。 若使用间接寻址并更新ARP,则必须指定移位操作数。若并不希望移位,则应将该操作数写作0。例如: ADD +,0,AR2在正常情况下,若相加的结果产生进位,则进位位置1(C=1);当不产生进位时,进位位被清零(C=0)。但是,当加法带左移16位时,如果相加的结果产生进位,则进位位置1;如果不产生进位,则进位位不受影响。这样在把32位数加到累加器时,可使累加器产生正确的符号进位。 例13 ADD 1,1 ;(DP=6) ;(ACC)+((数据存储器301H)×21)→(ACC) 指令执行前指令执行后 数据存储器0301H1H数据存储器0301H1H ACCXC2HACCCC4H 例14 ADD+,0,AR0 ;(当前AR指定的数据单元)+(ACC)→(ACC) ;当前AR内容+1,AR0作为下次的辅助寄存器 指令执行前指令执行后 ARP4ARP0 AR40302HAR40303H 数据存储器0302H2H数据存储器0302H2H ACCXC2HACC0C4H