DSPC2000汇编指令

更新时间:2024-05-12 03:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第六章 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

代码生成工具编译生成的。

在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。 本节假设条件为芯片工作于C28x模式(OBJMODE=1,AMODE=0)。复位后,通过执行指令C28OBJ或者SETC OBJMODE将ST1中的OBJMODE位置1,芯片即可工作于C28x模式。

6.1.1 DSP中的操作数

汇编语言离不开操作符和操作数,操作符可以认为就是CPU的指令或者编译器上的伪指令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。 如表6-1,表6-2和表6-3对指令中常用到的一些操作数符号进行说明 符号 XARn ARn,ARm 描述 32位辅助寄存器XAR0~XAR7 32位辅助寄存器XAR0~XAR7的低16位 ARnH ARPn AR(ARP) AX # PM PC ~ [loc16] 32位辅助寄存器XAR0~XAR7的高16位 32位辅助寄存器指针,ARP0指向XAR0,ARP1指向XAR1?? ARP指向的辅助寄存器的低16位 累加器的高16位寄存器AH或者16位寄存器AL 立即数助记符 乘积移位方式(+4 ,1 ,0 ,-1,-2,-3,-4 ,-5 ,-6) 22位程序计数器 按位求反码 Loc16寻址方式对应的16位数据 XAR(ARP) ARP指向的辅助寄存器 0:[loc16] 将Loc16寻址方式对应的16位数据进行零扩展 S:[loc16] 将Loc16寻址方式对应的16位数据进行符号扩展 [loc32] Loc32寻址方式对应的32位数据 0:[loc32] 将Loc32寻址方式对应的32位数据进行零扩展 S:[loc32] 将Loc32寻址方式对应的32位数据进行符号扩展 7bit 0:7bit S:7bit 8bit 0:8bit S:8bit 10bit 0:10bit S:10bit 16bit 0:16bit S:16bit 22bit 0:22bit S:22bit LSb LSB LSW MSb MSB MSW OBJ N {} = == 表示7位立即数 7位立即数,零扩展 7位立即数,符号扩展 表示8位立即数 8位立即数,零扩展 8位立即数,符号扩展 表示10位立即数 10位立即数,零扩展 10位立即数,符号扩展 表示16位立即数 16位立即数,零扩展 16位立即数,符号扩展 表示22位立即数 22位立即数,零扩展 22位立即数,符号扩展 最低有效位 最低有效字节 最低有效字 最高有效位 最高有效字节 最高有效字 对于某条指令,位OBJMODE的状态 重复次数(N=0,1,2,3,4,5,6?) 可选字段 赋值 等于 表6-1操作数符号及说明

在应用程序的开发过程当中少不了的就是算术运算还有比较运算,当然在汇编语言编程的时候也是一样的,在汇编语言当中进行算术运算的操作并不像C/C++那样直观、方便,需要掌握众多的助记符才行,接下来会通过表6-2来说明一下关于算术方面的助记符以及与其相关的标志位。

COND 语法 0000 NEQ 0001 EQ 0010 GT 0011 GEQ 0100 LT 0101 LEQ 0110 HI 1000 LO,NC 1001 LOS 1010 NOV 1011 OV 1100 NTC 1101 TC 1110 NBIO 1111 UNC 描述 不等于 等于 大于(有符号减法) 小于(有符号减法) 高于(无符号减法) 低于(无符号减法) 无溢出 溢出 测试位为0 测试位为1 BIO输入等于零 无条件 测试标志位 Z=0 Z-1 Z=0且N=1 N=1 C=1且Z=0 C=0 V=0 V=1 TC=0 TC=1 BIO=0 大于或等于(有符号减法) N=0 小于或等于(有符号减法) Z=1或N=1 0111 HIS,C 高于或相同(无符号减法) C=1 低于或相同(无符号减法) C=1或Z=0 表6-2影响指令的判断条件的说明

在汇编程序当中实现乘法操作时一件非常不简单的事,由于是属于纯寄存器操作,因此,开发人员需要准备保存乘法结果的地址,在表6-1当中讲解操作数符号的时候有一个关于乘积操作的符号—PM,那么它的结果保存是如何执行的呢?下面通过表6-3来说明一下。

PM 保存方式 +4 P(31:4)=相乘结果中低38位的(27:0),P(3:0)+0 +1 P(31:1)=相乘结果中低38位的(30:0),P(31)+0 0 P(31:0)=相乘结果中低38位的(31:0) -1 P(31:0)=相乘结果中低38位的(32:1) -2 P(31:0)=相乘结果中低38位的(33:2) -3 P(31:0)=相乘结果中低38位的(34:3) -4 P(31:0)=相乘结果中低38位的(35:4) -5 P(31:0)=相乘结果中低38位的(36:5) -6 P(31:0)=相乘结果中低38位的(37:6) 表6-3 PM与结果保存方式的关系

6.1.2汇编语法指令描述

前一小节提到过,汇编指令一般都由操作符和操作数组成,操作符也被称为指令助记符,

它是指令中的关键字,表示本条指令操作类型,不能省略。操作数可以省略,也可以有很多,但各操作数之间要用“,”分开。指令助记符与操作数之间要用空格分开。

ARn:

n为数值0~7,ARn指定下次的辅助寄存器。 ind:

选择一下7种符号之一:*,*+,*-,*0+,*0-,*BR0+,*BR0-(兼容模式使用)。 #:立即寻址方式中常用的前缀。数值前面带“#”,表示该数值为一个立即数。 <<左移。 >>右移。 @:

当使用C28x语法时,64位字段数据与通过“@”符号来表示,一帮组程序员理解当前正在使用哪种寻址模式。 @@:

当使用C28x语法时,128位字段数据页通过“@@”符号来表示。 loc16:16位寻址方式指定地址单元的内容。 loc32:32位寻址方式指定地址单元的内容。 #16bitsigned:16位有符号立即数。

6.2寻址方式

通过6.1节当中读者们应当对汇编语言编程有了一定的了解,仅仅了解了汇编语言的操作符还是不过的,接下来就从汇编语言最根本的开始学习——寻址方式寻址方式就是寻找操作数或者操作数地址的方式,在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式或堆栈存取方式。几乎所有的计算机,在内存中都采用地址指定方式。当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。C28x系列DSP的指令集采用7种寻址方式:

1. 直接寻址方式:DP(数据页指针),在此方式中,16位的DP寄存器被当做一个固定的

页指针,讲指令中提供6未或者7位的地址偏移量与DP寄存器中的值组合起来就构成完整的地址。当访问具有固定地址的数据结构时,这种寻址方式特别有用,例如,外设寄存器和C/C++中的全局及静态变量。 2. 堆栈寻址方式:SP(堆栈指针),在这种方式下,16位的SP指针被用来访问软件堆栈

的内容。C28x系列的堆栈是从低端地址想高端地址生长的,SP总是指向下一个空的存储单元。当需要访问堆栈中的数据时,SP的值减去指令仲提供的6位偏移量作为被访问数据的地址和,而堆栈指针将在入栈后加1,出栈前减1. 3. 间接寻址方式:XAR0到XAR7(辅助寄存器指针),在该方式下,32位的XARn寄存器被

当做一般的数据指针来使用个。通过相应的指令可以实现操作后XARn加1、操作前/后减1,还可以配合3位偏移量或者其他16位寄存器实现变址寻址。

4. 寄存器寻址方式:这种方式下,另一个寄存器可以是该次访问的资源或者目的操作数。

这样在C28x中既能实现寄存器到寄存器的操作。

5. 数据/程序/IO空间寻址方式:在这种方式下,存储器中操作数的地址被包含在指令中。 6. 程序空间间接寻址方式:某些指令可以通过指针来访问位于程序空间中的存储器操作

数。由于在C28xCPU中存储器是统一寻址的,所以单周期内可以读取两个操作数。 7. 字节寻址方式:该方式能访问到股东地址单元的最低有效位和最高有效位。

提示:

对于基于C28x的DSP芯片来说,以上的7种寻址方式仲出了IO空间寻址方式外其他的都支持。

C28x的大多数指令都是利用操作符中的8位字段来选择寻址方式和对寻址方式进行修改.在C28x的指令系统中,这个8位字段用于以下寻址方式:

1. loc16:为16位数据访问选择直接/堆栈/间接/寄存器寻址方式。

[loc16]表示loc16这种寻址方式对应的16位数据。

2. loc32:为32位数据访问选择直接/堆栈/间接/寄存器寻址方式。

[loc32]表示loc32这种寻址方式对应的32位数据。

在直接寻址方式下,loc16/loc32指的是一个用标号表示的地址,这个地址由16位的DP寄存器和操作码内8位字段的6位或7位偏移量共同决定。[loc16]/[loc32]表示这个地址对应的16/32位数据。以上7种寻址方式都与“loc16/loc32”组合起来使用。

在间接寻址方式下,loc16/loc32表示放在辅助寄存器(XAR0~XAR7)中的一个地址,[loc16]/[loc32]表示这个地址对应的16/32位数据。 在堆栈寻址方式下,loc16/loc32表示堆栈指针指向的一个堆栈单元,[loc16]/[loc32]表示这个单元内的16/32位数据。

在寄存寻址方式下, loc16/loc32表示一个16位或32位寄存器(如ACC、P、XT、AH等), [loc16]/[loc32]表示这些寄存器内的16/32位数据。

由于C28x提供了多种寻址方式,因此用寻址方式选择位(AMODE)来选择8位字段(loc16/loc32)的解码。该位属于状态寄存器ST1。寻址方式可以大致归类如下:

(1)AMODE=0——该方式是复位后的默认方式,也是C28x的C/C++编译器使用的方式。这种方式与C2xLP CPU的寻址方式不完全兼容。数据页指针偏移量是6位(在C2xLP CPU中是7位),并且不支持所有的间接寻址方式。

(2)AMODE=1——该方式包括的寻址方式完全与C2xLP 器件的寻址方式兼容。数据页指针的偏移量是7位并支持所有C2xLP 支持的间接寻址方式。

编译器总是假定AMODE=0,所以它只使用对AMODE=0有效的寻址模式。而汇编器可以通过设置命令行选项实现默认AMODE=0或者AMODE=1。 v28:假定AMODE=0(C28x寻址方式)

v28 – m20:假定AMODE=1(与C2xLP全兼容的寻址方式) 在文件中使用内嵌伪指令:

. c28_amode :告诉汇编器后面的代码段都假定AMODE=0(C28x寻址方式)

. lp_amode :告诉汇编器后面的代码段都假定AMODE=1(与C2xLP全兼容的 寻址方式) 指令操作码仲的8位字段决定了loc16/32寻址方式,其可用的寻址方式总结见表6-4。

AMODE=0 8位译码 0 0 Ⅲ Ⅲ loc16/32语法 @6位数 8位译码 0 1 Ⅲ Ⅲ 直接寻址方式(DP) @@7位数 堆栈寻址方式(SP) 0 1 Ⅲ Ⅲ *-SP[6位数] 1 0 Ⅲ Ⅲ *SP++ 1 0 111 110 *--SP 1 0 000 AAA *XARn++ 1 0 111 101 *SP++ 1 0 111 110 *--SP 1 0 000 AAA *XARn++ AMODE=1 loc16/32语法 C28x间接寻址方式(XRA0到XRA7)

1 0 001 AAA 1 0 010 AAA 1 0 011 AAA 1 0 Ⅲ AAA *--XRAn *+XRAn[AR0] *+XRAn[AR1] *+XRAn[3位数] 1 0 001 AAA 1 0 010 AAA 1 0 011 AAA *--XRAn *+XRAn[AR0] *+XRAn[AR1] 表6-4 loc16/loc32的寻址方式

6.2.1直接寻址方式

指令字中包含数据存储器的7位便宜地址与基地址构成16位数据存储器地址,基地址由数据页指针DP或堆栈指针SP提供,具体由ST1的CPL决定。64K数据存储器包含512个数据页指针DP,DP的范围记为0~511.状态寄存器ST0内的第9位数据指针中的值来确定当前数据页。具体的直接寻址方式如图6-1所示。

15~8位操作码7位I=06~0位数据存储器的地址 图6-1直接寻址方式

直接寻址方式下loc16/loc32的语法说明如表6-5所示。 AMODE(ST1.8) 偏移量 0 @6位数 每页大小 32位数据地址 64字 寻址范围 (32~22)=0 数据空间 (21~6)=DP:15~0 的低4M (5~0)=6位数 字的范围 (32~22)=0 (21~7)=DP:15~0 (6~0=7)位数 1 @@7位数 128字 表6-5直接寻址方式下loc16/loc32的语法说明 假设需要访问数据空间地址0000105DH: (1)AMODE=0:

使用直接寻址方式访问数据存储器时,必须首先对DP进行设置以确定数据页面,然后再书写进行某种操作的指令,该指令的操作数将确定数据页面内部的特定偏移单元。其步骤如下:

1. 设置数据页面将当前数据页面载入DP。 MOVW DP,#0041H ;初始化数据页面指针 2. 设置偏移量

给出6位偏移量作为指令的一个操作数。

ADD AL,@1Dh ; AL与当前数据页面内偏移1DH单元的内容相加,结果存入到AL中 如图6-2所示直接寻址下AMODE为0的地址分配

16bit00000000010000016bit011101DP:0041HOFFSET:1DH

图6-2直接寻址下AMODE为0的地址分配

(1)AMODE=1:

1选择兼容选址模式

SETC AMODE ;令AMODE=1

.lp_amode ;通知编译器AMODE=1 2设置数据页面

讲当前数据页面载入DP

MOVW DP,#0040H ;初始化数据页面指针 3设置偏移量

给出7位偏移量作为指令的一个操作数。

ADD AL,@@5Dh ;AL与当前数据页面内偏移量5DH单元的内容相加,结果存入到AL中 如图6-3所示直接寻址下AMODE为1的地址分配。

15bit0000000001000007bit1011101DP:0040HOFFSET:5DH

图6-3直接寻址下AMODE为1的地址分配

6.2.2堆栈寻址方式

在堆栈寻址方式下,16位的SP指针被用于访问软件堆栈的信息。C28x的堆栈从存储器的低地址变化到高地址(小端方式),SP指针总是指向下一个空单元.当需要访问堆栈中的数据时,由程序提供6位偏移量,SP的值减去这6位的偏移量就是被访问的数据的地址,然后修改堆栈指针,堆栈寻址方式下loc16/loc32的语法说明见表6-6所示。

AMODE(ST1.8) 偏移量 0 X 32位数据地址 寻址范围 *-SP[6位] (32~16)=0 (15~0)=SP-6位 *SP++ (32~16)=0 数据空间 (15~0)=SP 如果loc16,SP=SP+1 的低64K 如果loc132,SP=SP+2 字的范围 (32~16)=0 (15~0)=SP 如果loc16,SP=SP-1 如果loc132,SP=SP-2 X *--SP 表6-6堆栈寻址方式下loc16/loc32的语法说明

下面的例子是带偏移量的堆栈寻址方式访问对栈区16/32数据,当AMODE=0时: ADD AL,*-SP[5] ;将(SP-5)指向堆栈单元的16位内容加到AL; MOV *-SP[8],AL ;将AL中的16位内容存入(SP-8)指向的堆栈单元 ADDL ACC,*-SP[12] ;将(SP-12)指向的堆栈单元的32位内容加到ACC

MOVL *-SP[34],ACC ;讲讲ACC中的32位内容存入(SP-34)指向的堆栈单元

下面的例子是利用堆栈寻址方式递增访问堆栈区16/32为数据: MOV *SP++,AL ;将16位AL寄存器的值压入栈顶,且SP=SP+1 MOVL *SP++,P ;将32位P寄存器的值压入栈顶,且SPSP+2

最后通过例子来讲解一下通过堆栈寻址方式递减访问堆栈区16/32数据: ADD AL,*--SP ;SP=SP-1,再把新SP指向的16位堆栈的内容加到AL中 MOVL ACC,*--SP ;SP=SP-2,再把新的SP指向的32位堆栈内容移到ACC中

6.2.3间接寻址方式

间接寻址方式的基本概念是指CPU对操作数读写时,通过辅助寄存器中存放的地址访问操作数。

逻辑上来讲是在间接寻址方式下,32位的XARn(辅助寄存器)被当做是一般性数据指针。其内容是操作数所在数据存储器的32位地址,CPU通过这个地址来取操作数。可以通过指令实现对辅助寄存器XARn加1加2、减1减2和变址操作(操作前/后),C28x的间接寻址方式(XAR0~XAR7)。

例如指令:MOVL ACC,*XAR2++;假设XAR2的值位0x80100h,内容地址0x80100的存储单元内容位1234h,0x80101的内容位5678h,执行这条指令后,ACC=56781234h,XAR2=80102h。 在物理上来看间接寻址方式下执行指令: MOVL ACC,*XAR2++,地址和数据通过寄存器和总线传送,当CPU将这条指令从程序空间读出并译码后,AEAU把XAR2中存放的地址0x00080100发送到DRAB上,然后CPU通过DRDB把内存单元数据56781234h读到数据缓冲寄存器,在发送操作数总线上(至此寻址过程结束),ALU读取DRDB的数据,经过处理后发送结果到结果总线,然后放入ACC中。间接寻址方式的loc16/loc32语法说明见表6-7所示。

AMODE Loc16/32语法 X X *XARn++ *--XARn 说明 ARP=n (31~0)=XARn 如果loc16,XARn=XARN+1 如果loc32,XARn=XARN+2 ARP=n (31~0)=XARn 如果loc16,XARn=XARN-1 如果loc32,XARn=XARN-2 ARP=n (31~0)=XARn+AR0 ARP=n (31~0)=XARn+AR1 X X X *+XARn[AR0] *+XARn[AR1] *+XARn[3位数] ARP=n (31~0)=XARn+三位数 表6-7 C28x的间接寻址方式下的loc16/loc32的语法说明

几乎所有的处理器都具有间接寻址方式(只是使用数据指针寄存器不同而已),如F2812读/写操作数。

6.2.4寄存器寻址方式

在该寻址方式下,寄存器可以是访问的源操作数,也可以是目标操作数,这样在C28x中就能实现寄存器到寄存器的操作.这一方式包括对32位和16位寄存器的寻址。寄存器寻址方式说明见表6-8所示。 AMODE Loc16/loc32语法 X X X X X X X X X X X @ACC @P @XT @XARn @AL @AH @PL @PH @TH @SP @ARn 说明 访问32位寄存器ACC。当寄存器@ACC位目的地操作数是,Z、N、V、C、OVC等标志可能会受到影响 访问32位寄存器P 访问32位寄存器XT 访问32位寄存器XARn 访问16位寄存器AL。AH的内容不受影响。当@AL位目的操作数时,Z、N、V、C、OVC等标志可能会受到影响 访问16位寄存器AH。AL的内容不受影响。当@AH位目的操作数时,Z、N、V、C、OVC等标志可能会受到影响 访问16位寄存器PL。寄存器PH的内容不受影响 访问16位寄存器PH。寄存器PL的内容不受影响 访问16位寄存器TH。寄存器TL的内容不受影响 访问16位寄存器SP 访问16位寄存器AR0~AR7的内容。寄存器ARH0~ARH7的内容不受影响

表6-8寄存器寻址方式下的loc16/loc32语法说明 下面通过以下简单的例子来说明一下在汇编程序当中的寄存器寻址的相关操作。

1、ACC寄存器寻址32位数据

MOVL XAR6,@ACC ;将ACC的内容装入到XAR6 MOVL @ACC,XT ;将XT寄存器的内容装入到ACC ADDL ACC,@ACC ;ACC=ACC+ACC

2、P寄存器寻址32位数据

MOVL XAR6,@P ;将P的内容装入到XAR6 MOVL @P,XT ;将XT寄存器的内容装入P ADDL ACC,@P ;ACC+ACC+P

3、AX寄存器寻址16位数据

MOV PH,@AL ;将AL的内容装入到PH ADD AH,@AL ;AH=AH+AL

MOV T,@AL ;将AL的内容装入T

6.2.5数据/程序/IO空间立即寻址方式

在该寻址方式下,存储器操作的地址就存在指令中。数据/程序/IO空间立即寻址方式的说明见表6-9所示。

语法 地址说明 *(0:16位) 32位数据地址:(31:16)=0、(15:0)=16位立即数 PS:指令重复执行时地址在操作后+1,只能寻址数据空间的低64K *(PA) 0:pma *(pma) 32位数据地址:(31:16)=0、(15:0)=16位立即数 PS:指令重复执行时地址在操作后+1, 22位程序地址:(21:16)=0、(15:0)=pma PS:指令重复执行时地址在操作后+1,只能寻址数据空间的低64K 22位程序地址:(21:16)=0x3F、(15:0)=pma PS:指令重复执行时地址在操作后+1,只能寻址数据空间的高64K 表6-9数据/程序/IO空间立即寻址方式下的指令语法说明

6.2.6程序空间间接寻址方式

某些指令可以通过使用间接指针对程序空间中的存储器进行访问。因为C28xCPU的存储器是标准一致的,使用的是统一寻址,这就使在一个机器周期中进行两次读操作成为可能。 程序空间间接寻址方式说明见表6-10所示。 语法 *AL 地址说明 22位程序地址:(21:16)=0x3F、(15:0)=AL PS:如果指令重复执行,AL的地址会被复制到影子寄存器,同时其地址会在每一执行后+1,寄存器AL中断内容没有改变。只能寻址数据空间的高64K 22位程序地址:(21:0)=XAR7 PS:如果该指令重复执行,只有在指令XPREAD和XPWRITE中,XAR7中存放的地址才能被复制到影子寄存器中,同时地址置将会在每次执行都+1,寄存器XAR7的值并没有被修改,对于其他指令即使重复执行,地址值也不增加 *XAR7

*XAR7++ 22位程序地址:(21:0)=XAR7 如果是16位数据操作,XAR7+=1 如果是32位数据操作,XAR7+=2 PS:如果指令被重复执行,地址每次执行后增加1 表6-10程序空间间接寻址方式下的指令语法说明 6.2.7字节寻址方式

字节寻址方式见表6-11 说明 语法 *+XARn[AR0] 32位数据地址(31:0)=XARn+偏移量(即AR0/AR1/3bit) *+XARn[AR1] 如果(偏移量=偶数),访问16位存储单元的最低有效字节;其最高字节不受*+XARn[3bit] 影响 如果(偏移量=偶数),访问16位存储单元的最高有效字节;其最低字节不受影响 PS:其他寻址方式只能访问固定地址单元的最低有效字节,而不影响最高有效字节 表6-11字节寻址方式语法说明 字节寻址的例子如下:

MOV AX.LSB,loc16 ;若(地址方式=*+XARn[AR0/AR1/3bit])

;若(偏移量=偶数值),AX.LSB=[loc16].LSB,AX.MSB=0x00 ;若(偏移量=奇数值),AX.LSB=[loc16].MSB,AX.MSB=0x00 ;否则,AX.LSB=[loc16].LSB,AX.MSB=0x00 MOVB AX.MSB,loc16 ;若(地址方式=*+XARn[AR0/AR1/3bit])

;若(偏移量=偶数值),AX.LSB=原值,AX.MSB= [loc16].LSB ;若(偏移量=奇数值),AX.LSB=原值,AX.MSB=[loc16].MSB ;否则,AX.LSB=[loc16].LSB,AX.MSB=[loc16].LSB

6.3 C28x汇编操作指令

在C28x系列的DSP当中有超过150条的汇编指令,按照功能来分可分位15类,接下来通过表格的方式向读者解释一下最常用的指令。 1.对辅助寄存器(XAR0~XAR7)的操作

CPU提供了8个32位的辅助寄存器:XAR0、XAR1、XAR2、XAR3、XAR4、XAR5、XAR6和XAR7。可以作为地址指针指向存储器,或者作为通用目的寄存器来使用。许多指令可以访问XAR0~XAR7的低16位,其中,辅助寄存器的低16位为AR0~AR7,它们用作循环控制和16位比较的通用目的寄存器。当访问AR0~AR7时,寄存器的高16位(AR0H~AR7H)可能改变或者不改变,着主要取决于所应用的指令。AR0H~AR7H只能作为XAR0~XAR7的一部分来读取,不能单独进行访问。具体操作看表6-12。

助记符 ADD XARn,#7bit ADRK #8bit CMPR 0/1/2/3 说明 7位立即数加到辅助寄存器XARn 8位立即数加到当前辅助寄存器 比较辅助寄存器 MOV AR6/7,loc16 MOV loc16,ARn MOV XARn,PC MOVB XARn,#8bit MOVL XARn,loc32 MOVL loc32,XARn MOVZ ARn,loc16 SBRK #8bit SUBB XARn,#7bit [loc16]加载到辅助寄存器 存储16位辅助寄存器到loc16 保存当前程序指针到辅助寄存器 8位立即数加载到辅助寄存器XARn [loc32]加载32位辅助寄存器 存储32位辅助寄存器内容到loc32 加载XARn的低16位清除高16位 从当前辅助寄存器仲减去8位立即数 从辅助寄存器XARn中减去7位立即数 MOVB AR6/7,#8bit 8位立即数加载到辅助寄存器AR6/7 MOVL XARn,#22bit 用22位立即数加载32位辅助寄存器XARn 表6-12对寄存器XARn的操作说明

2.对数据页指针(DP)的操作

在直接寻址方式中,对数据存储器的寻址要在64个字(即一个页面为64个字)的数据页中进行。由低4M字节的数据存储器组成65536个数据也,用0-65535进行标号 。在DP直接寻址方式下,16位的数据页指针(DP)包含了目前的数据页数。可以通过DP通过给DP赋新值去改变数据页号。具体操作说明看表6-13。 助记符 MOV DP,#10bit MOVW DP,#19bit 说明 加载10位立即数到数据页指针 加载整个数据页 MOVZ DP,#10bit 加载数据页并清除高位 表6-13对DP寄存器操作的说明

3.对堆栈指针SP的操作

堆栈指针(SP)允许在数据存储器中使用软件堆栈。堆栈指针为16位,可以对数据空间的低64K进行寻址。当使用SP时,将32位地址的高16位置为0。复位后SP指向地址00000400h。堆栈操作说明如下: 1.栈从低地址向高地址增长。

2.P总是指向堆栈中的下一个区域。

3.SP被初始化,它指向地址00000400h。

4.将32位数值存入堆栈时,先存入低16位,然后将高16位存入下一个高地址中。

5.当读取32位的数值时,C28x系列的CPU期望存储器或外设接口逻辑把读写排成偶地址。例如,如果SP包含一个奇数地址00000083h,那么,进行一个32位的读操作时,将从地址00000082h和00000083h中读取数值。

6.如果增加SP的值。如果他超过FFFFh,或者减少SP的值,使它低于0000h开始计数。例如,如果SP=FFFFh而一个指令又想SP加3,啫结果是0001h。当减少SP的值使它达到0000h,它就会重新从FFFFh计数。例如,如果SP=0002h而一个指令又从SP减4,则结果就是FFFFh。 7当数值存入堆栈是,SP并不要求排成奇数或者偶数地址。排列由存储器或者外设接口逻辑完成。具体的语法操作说明看表6-14。

助记符 ADDB SP,#7bit POP ACC POP AR1:AR0 POP AR1H:AR1H 说明 7位立即数加载堆栈指针 堆栈内容弹出到寄存器ACC 堆栈内容弹出到寄存器AR1和AR0 堆栈内容弹出到寄存器AR1H和AR1H POP DBGIER POP DP:ST1 POP DP POP IFR POP loc16 POP P POP RPC POP ST0 POP ST1 POP T:ST0 POP XT POP XARn PUSH ACC PUSH ARn:ARm PUSH DBGIER PUSH DP:ST1 PUSH DP PUSH IFR PUSH loc16 PUSH P PUSH RPC PUSH ST0 PUSH ST1 PUSH T:ST0 PUSH XT PUSH XARn SUBB SP,#7bit 堆栈内容弹出到寄存器DBFIER 堆栈内容弹出到寄存器DP和ST1 堆栈内容弹出到寄存器DP 堆栈内容弹出到寄存器IFR 堆栈内容弹出到loc16 堆栈内容弹出到寄存器P 堆栈内容弹出到寄存器RPC 堆栈内容弹出到寄存器ST0 堆栈内容弹出到寄存器ST1 堆栈内容弹出到寄存器T和ST0 堆栈内容弹出到寄存器XT 堆栈内容弹出到辅助寄存器 寄存器ACC的内容入栈 寄存器ARN和ARm的内容入栈 寄存器DBGIER的内容入栈 寄存器DP和ST1的内容入栈 寄存器DP的内容入栈 寄存器IFR的内容入栈 [loc16]入栈 寄存器P的内容入栈 寄存器RPC的内容入栈 寄存器ST0的内容入栈 寄存器ST1的内容入栈 寄存器T和ST0的内容入栈 寄存器XT的内容入栈 辅助寄存器的内容入栈 从堆栈指针中减去7位立即数 PUSH AR1H:AR0H 寄存器AR1H和AR0H的内容入栈 表6-14对SP寄存器操作的说明

4.对AX寄存器的操作

在汇编语言程序中,累加器——AX是一个非常重要的寄存器,但在程序中用它来保存临时数据时,最好将其转存到其它寄存器或内存单元中,以防止在其它指令的执行过程中使其中的数据被修改,从而得到不正确的结果,为程序的调试带来不必要的麻烦。具体操作请看表6-15。 助记符 ADD AX,loc16 ADD loc16,AX ADDB AX,#8bit ANDB AX,#8bit ASR AX,#(1-16) ASR AX,T [loc16]加到AX 将AX的内容与[loc16]相加,并存储到loc16 将8位立即数累加到AX AX与8位立即数(零扩展)逐位“与” 算术右移,移位次数由立即数决定 算术右移,以为次数由T(3:0)的值决定 说明 AND AX,loc16,#16bit 16位立即数和[loc16]逐位“与”,结果保存到AX CMP AX,loc16 CMPB AX,#8bit FLIP AX LSL AX,#(1-16) LSL AX,T LSR AX,#(1-16) LSR AX,T MAX AX,loc16 MIN AX,loc16 MOV AX,loc16 MOV loc16,AX MOV loc6,AX,COND MOVB AX,#8bit MOVB AX,LSB,loc16 MOVB AX,MSB,loc16 MOVB loc16,AX,LSB MOVB loc16,AX,MSB NEG AX NOT AX OR AX,loc16 OR loc16,AX ORB AX,#8bit SUB AX,loc16 SUB loc16,AX SUBR loc16,AX SXTB AX XOR AX,loc16 XOR loc16 ,AX XORB AX,#8bit AX与[loc16]比较 AX与8位立即数(零扩展)比较 将AX寄存器中的数据位翻转顺序 逻辑左移,移位次数由立即数决定 逻辑左移,移位次数由T(3:0)的值决定 逻辑右移,移位次数由立即数决定 逻辑右移,移位次数由T(3:0)的值决定 AX与[loc16]相比较求最大值,并保存到AX AX与[loc16]相比较求最小值,并保存到AX [loc16]加载到AX 寄存器AX保存到loc16 有条件地把AX存储到loc16 把8位立即数(零扩展)加载到AX 加载AX的低字节,AX的高字节等于0x00 加载AX的高字节,AX的低字节不变 加载AX的低字节 加载AX的高字节 求AX的相反数 求AX的“非” AX和[loc16]按位“或”,结果保存到AX AX和[loc16]按位“或”,结果保存到loc16 AX和8位立即数(零扩展)按位“或”,结果保存到AX 从AX中减去[loc16] [loc16]减去AX中的数据,结果存储到loc16 反向减法,AX中的数据减去[loc16],结果存储到loc16 将AX的低字节符号扩展到高字节 AX和[loc16]按位“异或”,结果保存到AX AX和[loc16]按位“异或”,结果保存到loc16 AX与8位立即数(零扩展)逐位“异或”,结果保存到AX 表6-15 AX寄存器操作说明

5.对16位ACC寄存器的操作

累加器(ACC)是CPU的主要工作寄存器。除了那些对存储器和寄存器的直接操作外,所有的ALU操作结果最终都要送入ACC。ACC支持单周期数据传送、加法、减法和来自数据存储器的宽度为32位的比较运算,它也可以接受32位乘法操作的运算结果。对ACC可以单独进行16位/8位的访问。累加器还具有如下的相关状态位。 (1).溢出模式位(OVM) (2).符号扩展模式位(SXM) (3).测试/控制标志位(TC) (4).进位位(C) (5).零标志位(Z) (6).负标志位(N) (7).溢出标志位(V)

(8).溢出计数位(OVC)

对于ACC寄存器的具体操作说明请看表6-16 16位ACC寄存器操作说明、表6-17 32位ACC寄存器操作说明和表6-18 64位ACC寄存器操作说明 助记符 说明 ADD ACC,loc16{<<#0...16} 将[loc]移位后(位扩展)加到ACC ADD ACC,#16bit{<<#0...15} 将16位立即数移位后(位扩展)加到ACC ADD ACC,loc16<

LSRL ACC,T LSLL ACC,T MAXL ACC,loc32 MINL ACC,loc32 MOVL ACC,loc32 MOVL ACC,P<

MOVL loc32,ACC,COND 有条件地将ACC存储到loc32 助记符 ASR64 ACC:P,T CMP64 ACC:P LSL64 ACC:P,T LSR64 ACC:P,T NEG64 ACC:P SAT64 ACC:P 说明 按T(5:0)对64位数值算术右移 比较64位数值 按T(5:0)对64位数值逻辑左移 按T(5:0)对64位数值逻辑右移 取ACC:P的相反数 根据OVC的值使ACC:P的值为饱和值 ASR64 ACC:P,#1...16 64位数值算术右移1~16位 LSL64 ACC:P,#1...16 64位数值逻辑左移1~16位 LSR64 ACC:P,#1...16 64位数值逻辑右移1~16位 表6-18 64位ACC寄存器操作说明

5 .对P或XT寄存器的操作

被乘数寄存器(XT寄存器)主要用于在32位乘法操作之前,存放一个32位有符号整数

值。XT寄存器的低16位部分是TL寄存器。该寄存器能装载一个16位有符号数,能自动对该数进行符号扩展,然后将其送人32位XT寄存器。XT寄存器的高16位部分是T寄存器。该寄存器主要用来存储16位乘法操作之前的16位整数值。T寄存器也可以为一些移位操作设定移位值,在这种情况下,根据指令,只可以使用T寄存器的一部分。具体的操作说明看表6-19. 助记符 ADDUL P,loc32 MAXCUL P,loc32 MINCUL P,loc32 MOV PH,loc16 MOV PL,loc16 MOV loc16,P MOV T,loc16 MOV loc16,T MOV TL,#0 MOVA T,loc16 MOVH loc16,P MOVL P,loc16 MOVL loc16,P MOVL loc32,P MOVL P,loc32 MOVL XT,loc32 MOVL loc32,XT MOVP T,loc16 MOVS T,loc16 MOVX TL,loc16 SUBUL P,loc32 说明 无符号数[loc32]加到寄存器P 有条件地求无符号数[loc32]和P的最大值,存储到P 有条件地求无符号数[loc32]和P的最小值,存储到P [loc16]加载PH [loc16]加载PL 存储移位后的P寄存器的低16位 [loc16]加载到T 存储T寄存器到loc16 清除TL [loc16]加载到T寄存器并与先前的乘积相加 保存PH到loc16 [loc16]加载到P寄存器 寄存器P加载到[loc16] 寄存器P加载到[loc32] [loc32]加载到P寄存器 [loc32]加载到XT寄存器 存储寄存器XT到loc32 [loc16]加载到T寄存器并将寄存器的内容保存到ACC [loc16]加载到T寄存器并从ACC中减去P寄存器的内容 [loc16]符号扩展后加载到TL P减去[loc32] MOVDL XT,loc32 存储XT寄存器并加载新XT寄存器 表6-19 P或XT的操作的说明

6.对中断控制寄存器的操作(IFR、IER、DBGIER)

C28x有3个寄存器用于控制中断:中断标志寄存器(IFR)、中断使能寄存器(IER)和调试中断使能寄存器(DBGIER)。IFR包含的标志位用于可屏蔽中断(可以用软件进行屏蔽)。当通过硬件或软件设定了其中某位时,则相应的中断就被使能。可以用IER中的相应位屏蔽和使能中断。当DSP工作在实时仿真模式并且CPU被挂起时,DBGIER表明可以使用时间临近中断(如果被使能)。具体操作看表6-20。 助记符 AND IER,#16bit AND IFR,#16bit IACK #16bit 说明 按位进行“与”操作来禁止指定的CPU中断 按位进行“与”操作来清除挂起的CPU中断 中断确认 INTR INT1/.../INT14、NMI、EMUINT、 仿真硬件中断 DLOGINT、RTOSINT、 MOV IER,loc16 加载中断允许寄存器 MOV loc16,IER OR IER,#16bit OR IFR,#16bit TRAT #0...31 存储中断允许寄存器 按位相“或” 按位相“或” 软件陷阱 表6-20中断寄存器的操作说明

7.对状态寄存器(ST0、ST1)的操作 C28x有两个状态寄存器ST0和STl,其中包含着不同的标志位和控制位。这些寄存器可以和数据寄存器交换数据,也可以保存机器的状态和为子程序恢复状态。状态位根据流水线中位值的改变而改变,ST0的位在流水线的执行阶段中改变,STl的位在流水线的译码2阶段中改变。状态寄存器ST0的各位,所有这些位都可以在流水线执行的过程中进行更改。状态寄存器ST0的位分布如图6-4所示,ST1的位分布如图6-5所示。具体的寄存器操作说明看表6-21

D15~D10OVC/OVCUD9~D7PMD6VD5ND4ZD3CD2TCD1OVMD0SXM

图6-4状态寄存器ST0的位分布

D15~D13ARPD6EALLOW助记符 CLRC mode CLRC XF CLRC AMODE C28ADDR D12XFD5LOOPD11D10D9D8D7M0M1MAP保留OBJMODEAMODEIDLESTATD4SPAD3VMAPD2PAGE0说明 清除各状态位 清除状态位XF并输出信号 清除AMODE位 清除AMODE状态位 清除OBJMODE位 清除M0M1MAP位 清除OVC位 清除OVC位 禁止屏蔽中断(置INTM位) 允许可屏蔽中断(清除INTM) 令乘积移位方式位PM=AX(2:0) 用指定单元高6位数加载溢出计数器 存储溢出计数器 置各状态位 D1BGMD0INTM

图6-5状态寄存器ST1的位分布

CLRC OBJMODE C27MAP CLRC OVC ZAP OVC DINT EINT MOV PM,AX MOV OVC,loc16 MOV loc16,OVC SETC Mode MOVU OVC,loc16 用指定单元低6位数加载溢出计数器 MOVU loc16,OVC 存储溢出计数器到指定单元的低6位并且高10位清0 SETC XF SETC M0M1MAP C28MAP SETC OBJMODE SETC AMODE LPADDR SPM PM 置XF位并输出信号 置M0M1MAP位 置M0M1MAP位 置OBJMODE位 置AMODE位 置AMODE位 设置乘积移位方式 表6-21状态寄存器操作说明

8.对16*16乘法操作的说明(见表6-22 16*16乘法操作说明) 助记符 MAC P,loc16,0:pma MAC P,loc16,*XAR7/++ MAY P,T,loc16 MPY ACC,loc16,#16bit MPYA P,loc16,#16bit MPYA P,T,loc16 MPYB P,T,#8bit MPYS P,T,loc16 MPYB ACC,T,#8bit MPYU ACC,T,loc16 MPYU P,T,loc16 MPYXU P,T,loc16 MPYXU ACC,T,loc16 SQRA loc16 SQRS loc16 XMAC P,loc16,*(pma) XMACD P,loc16,*(pma) 相乘且累加 相乘且累加 16位*16位乘法 16位*16位乘法 16位*16位乘法并加上先前乘积 16位*16位乘法并加上先前乘积 有符号数与8位无符号立即数相乘 16位*16位乘法并做减法 与8位立即数相乘 16位*16位无符号乘法 16位*16位无符号乘法 有符号数与无符号数相乘 有符号数与无符号数相乘 求平方值并讲P寄存器的内容加到ACC 求平方值并且ACC做减法 与C2xLP兼容性的相乘且累加 带有数据移动的、与C2xLP兼容性的相乘且累加 说明 DMAC ACC:P,loc32,*XAR7/++ 双16*16乘法且累加 表6-22 16*16乘法操作说明

9.对32*32乘法操作的说明(见表6-23 32*32乘法操作说明) 助记符 IMPYAL P,XT,loc32 IMPYL P,XT,loc32 IMPYL ACC,XT,loc32 IMPYSL P,XT,loc32 IMPXUL P,XT,loc32 QMACL P,XT,loc32 QMPYAL P,XT,loc32 QMPYL P,XT,loc32 QMPYL ACC,XT,loc32 说明 有符号32位数乘法(低半段)且加上先前P的内容 有符号32位数*有符号32位数(低半段) 有符号32位数*有符号32位数(低半段) 有符号32位数乘法(低半段)且减去先前P的内容 有符号32位数*无符号32位数(低半段) 有符号32位数*有符号32位数且累加(高半段) 有符号32位数乘法(高半段)且加上先前P的内容 有符号32位数*有符号32位数(高半段) 有符号32位数*有符号32位数(高半段) IMACL P,loc32,*XAR7/++ 有符号32位数*有符号32位数且累加(低半段) QMPYSL P,XT,loc32 QMPXUL P,XT,loc32 有符号32位数乘法(高半段)且减去先前P的内容 有符号32位数*无符号32位数(高半段) 表6-23 32*32乘法操作说明

10.直接寄存器操作(见表6-24) 助记符 ADD loc16,#16bit AND loc16,#16bit CMP loc16,#16bit DEC loc16 DMOV loc16 INC loc16 MOV loc16,*(0:16bit) MOV loc16,16bit MOV loc16,#0 OR loc16,#16bit TBIT loc16,#bit TBIT loc16,T TCLR loc16,#bit TSET loc16,#bit XOR loc16,#16bit 说明 有符号16位立即数与[loc16]相加,结果保存到loc16 有符号16位立即数与[loc16]按位“与”,结果保存到loc16 有符号16位立即数与[loc16]比较 [loc16] 减1 [loc16-1]=[loc16] [loc16]加1 16位地址指向存储单元的内容加载到loc16 存储16位立即数到loc16 清除[loc16] [loc16]和16位立即数按位“或”,结果保存到loc16 测试[loc16]中的指定位 测试[loc16]中由T寄存器指定的内容 测试并清除[loc16]中的指定位 测试并置[loc16]中的指定位为1 [loc16]和16位立即数按位“异或” MOVB loc16,#8bit,COND 有条件存储8位立即数(零扩展)到loc16 表6-24对直接存储器操作的说明

11.对I/O空间操作的说明(看表6-25) 助记符 IN loc16,*(PA) OUT *(PA),loc16 说明 从端口输入数据 从端口输出数据 UOUT *(PA),loc16 想I/O端口输出不受保护的数据 表6-25 I/O空间操作的说明

12.程序空间的操作说明(看表6-26)

助记符 PREAD loc16,*XAR7 PWRITE *XAR7,loc16 XPREAD loc16,*AL XPWRITE *AL,loc16 说明 将XAR7指向的程序空间的16位数据放到loc16 将[loc16]放到XAR7指向的程序空间的一个存储单元 与C2xLP兼容性的读程序操作 与C2xLP兼容性的写程序操作 XPREAD loc16,*(pma) 与C2xLP兼容性的读程序操作 表6-26程序空间操作的说明

13.跳转/调用/返回操作(看表6-27) 助记符 B 16bitoff,COND 说明 有条件跳转,PC=PC+16位偏移地址(-32768~+32767)

BANZ 16bitoff,ARn-- BF 16bitoff,COND FFC XAR7,22bitoff IRET LB 22bitAddr LB *XAR7 LC 22bitAddr LC *XAR7 LCR *XARn LCR 22bitAddr LOOPZ loc16,#16bit LOOPNZ loc16,#16bit lLRET LRETE LRETR RPT #8bit/loc16 SB #8bitoff,COND SBF #8bitoff,EQ/NEQ/TC/NTC XB pma XB pma,COND XB pma,*ARPn XB *AL XCALL pma,*ARPn XBANZ pma,*ind{,ARPn} XBCALL pma, XCALL pma,COND XCALL *AL XRET XRETC COND 若辅助寄存器为0,进行跳转,PC变化同上 快速跳转,PC变化同上 快速调用函数,XAR7保存当前PC,PC=22位程序地址 中断返回 长跳转,PC=22位程序地址 间接长跳转,保存在XAR7中的22位程序地址到PC 直接长调用,PC=22位程序地址 间接长调用,保存在XAR7中的22位程序地址到PC 使用RPC的间接长调用 使用RPC的长调用,PC=22位程序地址 [loc16]与16位立即数相与为0时循环 [loc16]与16位立即数相与非0时循环 长返回 长返回且允许中断 使用RPC的长返回 重复下一条指令N次,N由8位立即数或[loc16]决定 有条件短跳转,PC变化同上 快速有条件跳转,PC变化同上 与C2xLP兼容性的跳转 与C2xLP兼容性的有条件跳转 与C2xLP兼容性的功能调用跳转 与C2xLP兼容性的功能调用 与C2xLP兼容性的功能调用且改变ARP 若ARn不为0,与C2xLP兼容性的跳转 与C2xLP兼容性的调用 与C2xLP兼容性的条件调用 与C2xLP兼容性的间接调用 等效于XRETC UNC 与C2xLP兼容性的条件性返回 BAR 16bitoff,ARn,ARm,EQ/NEQ 根据辅助寄存器比较进行跳转,PC变化同上 表6-27跳转/调用/返回操作的说明

14.其他操作的说明(表6-28)

助记符 ABORTI ASP EALLOW IDLE NASP ZAPA EDIS ESTOPO 对齐堆栈指针 允许访问受保护的寄存器/空间 置处理器与低功耗模式 不对齐堆栈指针 将累加器、P寄存器、OVC都清0 禁止访问受保护的寄存器/空间 仿真停止0 说明 终止中断,该指令仅仅为一条仿真指令 NOP {*int} 空跳,间接地址修改为可选操作 ESTOP1 仿真停止1 表6-28其他操作的说明

在C28x系列的汇编操作当中可不单单只有上面所讲述的17个表的操作说明,在这里只是对在开发程序时经常能用到的,也是最为基础的操作进行了说明,可以更好的使得刚刚接触汇编语言编程的读者很好的理解汇编语言。

6.4汇编程序

6.4.1汇编源程序格式

C28x系列芯片汇编源程序由源程序语句组成,源程序语句包含汇编伪指令、汇编语言指令、宏伪指令和注释。源语句包含有4各域(标号,助记符,操作数列表,注释)。 源程序语句通常格式如下:

[标号] [:] [||] 助记符 [操作数1,操作数2,...] [;注释] 对于上面抽象的解释肯定有不少的读者还是迷惑不解的,这样通过完整的汇编语句来讲解一下吧!

two .set 2 ;符号two=2 begin: MOV AR1,#two ;AR1=2

.word 016h ;用016h初始化一个字 LOOP MOV DP,#two 看可以各完整的汇编程序,读者们是不是特然觉得汇编没有想象中那么难呢!只要读者们一步一步来,先从基础的操作符号,操作方式来入手学习,进而理解好各种寻址方式,最后将汇编指令都搞清楚,这样学习汇编就不是一件难事了。需要注意的一点是,C28x汇编器每行最多可200字符,超过200个字符将被截断。为了保证汇编程序的正确(除了注释意外的部分),必须控制每一行都在200个字符以内。 接下来总结一下汇编程序的规则:

i. 所有语句必须以标号、空格、星号或分号开头。

ii. 标号是可选的,若用标号,它必须写在第一列的开始(否则编译出错)。 iii. 必须用一个或多个空格分隔每一个域。制表符(TAB等效位空格。

iv. 注释是可选的。在第一列开始的注释可以用星号或者分号(*或)打头,但在其他任何列

开始的注释必须以分号(;开头)。

v. 助记符不能从第一列开始,否则将被视为标号。 vi. “[]”表示该选项可选的。

提示:

1、标号对于所有的汇编指令和大部分的伪指令都是可选的。如果使用标号,标号必须从源程序语句的第一列开始。标号可以由128个字符(A-Z、a-z、0-9、_或$)构成,开头不能为数字

2、助记符包括:机器码助记符(如ADD、MOV或B)、汇编指令(如.data、.list、.set)、宏伪指令(如.macro、.var或.mexit)、宏调用。如果有(||),则表示该指令可有RPT指令重复。

3、所有的指令或伪指令都可以有一个或多个操作,或没有操作数。操作数包括:符号、

常数、表达式。

4、标号后面的(:)可有可无。

6.4.2常量

常数、字符串和符号是汇编器能识别的数据项,是汇编指令、伪指令和宏指令语句中操作数的基本组成部分。 ①常数

汇编器支持6中类型的常熟:

(1)二进制整数:以字母B(或b)结尾,由二进制数字(0,1)组成的数字串。数字串长度最多可达32个二进制数字,如010000110B。

(2)八进制整数:以字母Q(或q)结尾,由八进制数字(0~7)组成的数字串。数字串长度最多可达11个八进制数字,如100000Q。 (3)十进制整数:以字母D(或d)结尾(也可以默认),十进制整数由0~9组成的字符串。范围从-2147483648~4294967295,如-300000. (4)十六进制整数:以字母H(或h)结尾,有十六进制数字由0~9和A~F(或a~f)组成的字符串。数字串长度最多可达8各十六进制数字。 (5)字符常数:包含在单引号中的一个或两个字符的串。每个字符表示为8位ASCII码,如‘a’定义字符a,并在内部用61H表示。

(6)汇编时间常数:用.set伪指令对符号进行赋值,赋值内容不同,汇编符号所表示的含义也就不同了。

例如,用.set向符号赋值,则符号成为常数,为了在表达式中使用此常数,为了在表达式中使用此常数,赋予它的值必须是绝对值。 SHIFT .set 3 MOV AR1,#SHIFT

也可用.set将寄存器名赋予符号常数,此符号与寄存器是同义词,如 AUXR1 .set AR1 MOV AUXR1,#3

(7)浮点型常数:由整数部分、小数点、小数部分和指数部分组成,其格式如下: [+/-]nnn[.[nnn] [E/e[+/-]nnn]] 其中N表示十进制数字,“[]”内的部分是可选的。如3.0、3.14、-0.314e13.

②字符串

字符串是包含在双引号内的一串字符,双引号是字符串的一部分。串的最大长度是变化的,并由每一个使用字符串的伪指令定义的。字符在内部被定义为8位ASCII字符,如:“sample program”定义13个子的字符串sample program。 字符串用与下列场合:

(1).copy \中的文件名; (2).setc \中的段名;

(3).byte \中断数据初始化伪指令; (4).string伪指令的操作数。

字符串与字符常熟不同,字符常熟代表一个单独的整数值,而字符串是字符的列表。

③符号

符号被用做标号、常数及替代符号。符号名最多可由32各字母和数字混合组成(A~Z,a~z,0~9,$和_)。符号的第一个字符不能是数字,符号内不能有空格。用户定义的符号区分大小写,例如汇编时ABC、Abc和abc都会被识别为3个不同的符号。如果用汇编器选项(-C),可消除对大小写的识别。

6.4.3表达式与运算符

表达式由运算符、常数和符号组成。有效表达式的范围是-32768~+32767。表5-29将表达式内部使用的运算符按优先级分组列出。

组 运算符 1 2 + - ~ * / % << >> + - ^ | & < > <= >= =或== != 说明 取正 取负 求反(1的补码) 乘 除 求模 左移 右移 加 减 按位逻辑异或 按位逻辑或 按位逻辑与 小于 大于 小于或等于 大于或等于 等于 不等于 优先级 高 低 3 4 表6-29表达式内使用的运算符说明

提示:

(1)同组运算符的优先级以在前的为优;

(2)第一组运算符从右到左求值,其他组成从左到右

本章阐述了C28x系列DSP的寻址方式和汇编指令,并简单介绍了汇编程序的格式。许多情况向C28x的编程都可以使用c语言,因此初学者不必死记硬背汇编指令,理解汇编指令,只要能读懂汇编指令即可。希望读者们能通过本章的学习熟练掌握C28x的各种寻址方式,掌握常用湖边指令的功能和语法,汇编语句的格式,掌握CPU的工作原理,这样能有助于在开发DSP系统时写出高效优质的代码。

本文来源:https://www.bwwdw.com/article/mv6g.html

Top