3986.net
小网站 大容量 大智慧
相关标签
当前位置:首页 >> 计算机软件及应用 >>

DSPC2000汇编指令


第六章 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) XAR(ARP) AX # PM PC ~ [loc16] 0:[loc16] S:[loc16] [loc32] 0:[loc32] S:[loc32] 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 {} = ==

32 位辅助寄存器 XAR0~XAR7 的高 16 位 32 位辅助寄存器指针,ARP0 指向 XAR0,ARP1 指向 XAR1…… ARP 指向的辅助寄存器的低 16 位 ARP 指向的辅助寄存器 累加器的高 16 位寄存器 AH 或者 16 位寄存器 AL 立即数助记符 乘积移位方式(+4 ,1 ,0 ,-1,-2,-3,-4 ,-5 ,-6) 22 位程序计数器 按位求反码 Loc16 寻址方式对应的 16 位数据 将 Loc16 寻址方式对应的 16 位数据进行零扩展 将 Loc16 寻址方式对应的 16 位数据进行符号扩展 Loc32 寻址方式对应的 32 位数据 将 Loc32 寻址方式对应的 32 位数据进行零扩展 将 Loc32 寻址方式对应的 32 位数据进行符号扩展 表示 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 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 语法 NEQ EQ GT GEQ LT LEQ HI HIS,C LO,NC LOS NOV OV NTC TC NBIO UNC 描述 不等于 等于 大于(有符号减法) 大于或等于(有符号减法) 小于(有符号减法) 小于或等于(有符号减法) 高于(无符号减法) 高于或相同(无符号减法) 低于(无符号减法) 低于或相同(无符号减法) 无溢出 溢出 测试位为 0 测试位为 1 BIO 输入等于零 无条件 表 6-2 影响指令的判断条件的说明 在汇编程序当中实现乘法操作时一件非常不简单的事, 由于是属于纯寄存器操作, 因此, 开发人员需要准备保存乘法结果的地址, 在表 6-1 当中讲解操作数符号的时候有一个关于乘 积操作的符号—PM,那么它的结果保存是如何执行的呢?下面通过表 6-3 来说明一下。 PM +4 +1 0 -1 -2 -3 -4 -5 -6 保存方式 P(31:4)=相乘结果中低 38 位的(27:0) ,P(3:0)+0 P(31:1)=相乘结果中低 38 位的(30:0) ,P(31)+0 P(31:0)=相乘结果中低 38 位的(31:0) P(31:0)=相乘结果中低 38 位的(32:1) P(31:0)=相乘结果中低 38 位的(33:2) P(31:0)=相乘结果中低 38 位的(34:3) P(31:0)=相乘结果中低 38 位的(35:4) P(31:0)=相乘结果中低 38 位的(36:5) P(31:0)=相乘结果中低 38 位的(37:6) 表 6-3 PM 与结果保存方式的关系 测试标志位 Z=0 Z-1 Z=0 且 N=1 N=0 N=1 Z=1 或 N=1 C=1 且 Z=0 C=1 C=0 C=1 或 Z=0 V=0 V=1 TC=0 TC=1 BIO=0

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 1 1 1 0 Ⅲ Ⅲ loc16/32 语法 @6 位数 *-SP[6 位数] *SP++ *--SP *XARn++ 8 位译码 0 1 Ⅲ Ⅲ 直接寻址方式(DP) @@7 位数 堆栈寻址方式(SP) 1 Ⅲ Ⅲ 0 Ⅲ Ⅲ 0 111 110 0 000 AAA 1 1 1 0 111 101 0 111 110 0 000 AAA *SP++ *--SP *XARn++ AMODE=1 loc16/32 语法

C28x 间接寻址方式(XRA0 到 XRA7)

1 1 1 1

0 001 AAA 0 010 AAA 0 011 AAA 0 Ⅲ AAA

*--XRAn *+XRAn[AR0] *+XRAn[AR1] *+XRAn[3 位数]

1 1 1

0 001 AAA 0 010 AAA 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 所示。

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

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 的地址分配

图 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 的地址分配。

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

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

AMODE(ST1.8) 0 X

偏移量 *-SP[6 位] *SP++

32 位数据地址 (32~16)=0 (15~0)=SP-6 位 (32~16)=0 (15~0)=SP 如果 loc16,SP=SP+1 如果 loc132,SP=SP+2 (32~16)=0 (15~0)=SP 如果 loc16,SP=SP-1 如果 loc132,SP=SP-2

寻址范围

数据空间 的低 64K 字的范围

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 语法

说明 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 ARP=n (31~0)=XARn+三位数

X

*XARn++

X

*--XARn

X X X

*+XARn[AR0] *+XARn[AR1] *+XARn[3 位数]

表 6-7 C28x 的间接寻址方式下的 loc16/loc32 的语法说明 几乎所有的处理器都具有间接寻址方式(只是使用数据指针寄存器不同而已),如 F2812 读/写操作数。

6.2.4 寄存器寻址方式
在该寻址方式下,寄存器可以是访问的源操作数,也可以是目标操作数,这样在 C28x 中就能实现寄存器到寄存器的操作. 这一方式包括对 32 位和 16 位寄存器的寻址。 寄存器寻 址方式说明见表 6-8 所示。 AMODE X X X X X X X X X X X Loc16/loc32 语 法 @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 位) *(PA) 0:pma *(pma) 地址说明 32 位数据地址:(31:16)=0、(15:0)=16 位立即数 PS:指令重复执行时地址在操作后+1,只能寻址数据空间的低 64K 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] *+XARn[AR1] *+XARn[3bit] 说明 32 位数据地址(31:0)=XARn+偏移量(即 AR0/AR1/3bit) 如果(偏移量=偶数), 访问 16 位存储单元的最低有效字节; 其最高字节不受 影响 如果(偏移量=偶数), 访问 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 MOV MOV MOVB MOVB MOVL MOVL

AR6/7,loc16 loc16,ARn XARn,PC XARn,#8bit AR6/7,#8bit XARn,loc32 loc32,XARn

[loc16]加载到辅助寄存器 存储 16 位辅助寄存器到 loc16 保存当前程序指针到辅助寄存器 8 位立即数加载到辅助寄存器 XARn 8 位立即数加载到辅助寄存器 AR6/7 [loc32]加载 32 位辅助寄存器 存储 32 位辅助寄存器内容到 loc32 用 22 位立即数加载 32 位辅助寄存器 XARn 加载 XARn 的低 16 位清除高 16 位 从当前辅助寄存器仲减去 8 位立即数 从辅助寄存器 XARn 中减去 7 位立即数

MOVL XARn,#22bit MOVZ ARn,loc16 SBRK #8bit SUBB XARn,#7bit

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

表 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 POP POP POP SP,#7bit ACC AR1:AR0 AR1H:AR1H 说明 7 位立即数加载堆栈指针 堆栈内容弹出到寄存器 ACC 堆栈内容弹出到寄存器 AR1 和 AR0 堆栈内容弹出到寄存器 AR1H 和 AR1H

POP DBGIER POP DP:ST1 POP POP POP POP POP POP POP POP POP POP PUSH PUSH DP IFR loc16 P RPC ST0 ST1 T:ST0 XT XARn ACC ARn:ARm

堆栈内容弹出到寄存器 DBFIER 堆栈内容弹出到寄存器 DP 和 ST1 堆栈内容弹出到寄存器 DP 堆栈内容弹出到寄存器 IFR 堆栈内容弹出到 loc16 堆栈内容弹出到寄存器 P 堆栈内容弹出到寄存器 RPC 堆栈内容弹出到寄存器 ST0 堆栈内容弹出到寄存器 ST1 堆栈内容弹出到寄存器 T 和 ST0 堆栈内容弹出到寄存器 XT 堆栈内容弹出到辅助寄存器 寄存器 ACC 的内容入栈 寄存器 ARN 和 ARm 的内容入栈 寄存器 AR1H 和 AR0H 的内容入栈 寄存器 DBGIER 的内容入栈 寄存器 DP 和 ST1 的内容入栈 寄存器 DP 的内容入栈 寄存器 IFR 的内容入栈 [loc16]入栈 寄存器 P 的内容入栈 寄存器 RPC 的内容入栈 寄存器 ST0 的内容入栈 寄存器 ST1 的内容入栈 寄存器 T 和 ST0 的内容入栈 寄存器 XT 的内容入栈 辅助寄存器的内容入栈 从堆栈指针中减去 7 位立即数

PUSH AR1H:AR0H PUSH DBGIER PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH SUBB DP:ST1 DP IFR P RPC ST0 ST1 XT XARn SP,#7bit

PUSH loc16

PUSH T:ST0

表 6-14 对 SP 寄存器操作的说明 4.对 AX 寄存器的操作 在汇编语言程序中,累加器——AX 是一个非常重要的寄存器,但在程序中用它来保存临 时数据时,最好将其转存到其它寄存器或内存单元中,以防止在其它指令的执行过程中使其 中的数据被修改,从而得到不正确的结果,为程序的调试带来不必要的麻烦。 具体操作请看表 6-15。 助记符 ADD ADD ADDB AND ANDB ASR AX,loc16 loc16,AX AX,#8bit AX,loc16,#16bit AX,#8bit AX,#(1-16) [loc16]加到 AX 将 AX 的内容与[loc16]相加,并存储到 loc16 将 8 位立即数累加到 AX 16 位立即数和[loc16]逐位“与” ,结果保存到 AX AX 与 8 位立即数(零扩展)逐位“与” 算术右移,移位次数由立即数决定 算术右移,以为次数由 T(3:0)的值决定 说明

ASR AX,T

CMP CMPB FLIP LSL LSR MAX MIN MOV MOV MOV MOVB MOVB MOVB

AX,loc16 AX,#8bit AX AX,#(1-16) AX,#(1-16) AX,loc16 AX,loc16 AX,loc16 loc16,AX loc6,AX,COND AX,#8bit AX,LSB,loc16 AX,MSB,loc16

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 寄存器操作说明

LSL AX,T LSR AX,T

MOVB loc16,AX,LSB MOVB loc16,AX,MSB NEG NOT OR OR ORB SUB SUB SUBR SXTB XOR XORB AX AX AX,loc16 loc16,AX AX,#8bit AX,loc16 loc16,AX loc16,AX AX loc16 ,AX AX,#8bit

XOR AX,loc16

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 ADD ADD ADDB ADDCU ADDU AND MOV MOV MOV MOVB MOVH MOVU SUB SUB SUB SUBB SBBU OR XOR XOR ACC,loc16{<<#0...16} ACC, #16bit{<<#0...15} ACC,loc16<<T ACC,#8bit ACC,loc16 ACC,loc16 ACC,loc16 ACC,loc16{<<#0...16} ACC, #16bit{<<#0...15} ACC, ACC,#8bit loc16,ACC<<#1...8 ACC,#8bit ACC,loc16<<T ACC,loc16{<<#0...16} ACC, #16bit{<<#0...15} ACC,#8bit ACC,loc16 说明 将[loc]移位后(位扩展)加到 ACC 将 16 位立即数移位后(位扩展)加到 ACC [loc16]移位后(位扩展)加到 ACC,移位次数由 T(3:0)决定 8 位立即数(零扩展)加到 ACC 带进位加法,将无符号数[loc16](零扩展)加到 ACC 带无符号数[loc16](零扩展)加到 ACC 将[loc16](零扩展)和 ACC 逐位“与” 将[loc]移位后(位扩展)加载 ACC 将 16 位立即数移位后(位扩展)加载 ACC [loc16]移位后(位扩展)加载 ACC,移位次数由 T(3:0)决定 8 位立即数(零扩展)加载 ACC ACC 移位后高字节加载到 loc16 将无符号数[loc16]加载到 AL,AH=0 ACC 减去[loc16]移位后(位扩展)的数据,结果保存到 ACC ACC 减去[loc16]移位后(位扩展)的数据,结果保存到 ACC ACC 减去 16 位立即数移位后(位扩展)的数据,结果保存到 ACC ACC 减去 8 位立即数 反向带借位减法,ACC 减去无符号数[loc16] [loc16]和 ACC 按位“或” ,保存到 ACC 16 位立即数移位后和 ACC 按位"或",保存到 ACC [loc16]和 ACC 按位“异或” ,保存到 ACC 16 位立即数移位后和 ACC 按位"异或",保存到 ACC AL=0x8000,[loc6]加载 AH 表 6-16 16 位 ACC 寄存器操作的说明 助记符 ABS ABSTC ADDL ACC ACC loc32,ACC 说明 ACC 取绝对值 ACC 取绝对值加载到 TC [loc32]加到 ACC 将 ACC 的内容加到[loc32] 带进位加法,将[loc32]加到 ACC 将无符号[loc32]加到 ACC 按 T(4:0)对 ACC 进行算术右移 ACC 的内容与[loc32]比较 寄存器的内容移位后与 ACC 内容比较 对 ACC 的符号位进行计数 将 ACC 的内容逻辑左移 1~16 位 按 T(3:0)对 ACC 进行逻辑左移

OR ACC,loc16 ACC,#16bit{<<#0...15} ACC,loc16 ACC, #16bit{<<#0...15}

ZALR ACC,loc16

ADDL ACC,loc32 ADDCL ACC,loc32 ADDUL ACC,loc32 ASRL CMPL CMPL CSB LSL ACC,T ACC,loc32 ACC,P<<PM ACC ACC,#1...16

LSL ACC,T

LSRL LSLL MAXL MINL MOVL MOVL MOVL NORM NORM NEG NEGTC NOT ROL ROR SAT SFR SFR

ACC,T ACC,T ACC,loc32 ACC,loc32 ACC,P<<PM P,ACC loc32,ACC ACC,XARn++/-ACC,*ind ACC, ACC ACC ACC ACC ACC ACC,#1...16 ACC,T

按 T(4:0)对 ACC 进行逻辑右移 按 T(4:0)对 ACC 进行逻辑左移 求取 ACC 与[loc32]的最大值,存储到 ACC 求取 ACC 与[loc32]的最小值,存储到 ACC [loc32]加载到 ACC ACC 的内容加载到 loc32 有条件地将 ACC 存储到 loc32 把 ACC 的内容加载的寄存器 P 把 ACC 的内容加载到 loc32 规范化 ACC 并修改选定的辅助寄存器 兼容 C2xLP 的规范化 ACC 操作 取 ACC 的相反数 若 TC=1,取 ACC 的相反数 ACC 取“非” ACC 循环左移 ACC 循环右移 根据 OVC 的值使 ACC 的值未包和值 ACC 右移 1~16 位 按 T(3:0)的值对 ACC 右移 带借位减法,ACC 减去[loc32] ACC 有条件地减去[loc16] ACC 有条件地减去[loc32] ACC 减去[loc32] [loc32]减去 ACC 的内容,结果保存到 loc32 ACC 减去 P 移位后的值 ACC 减去无符号数[loc32] 测试 ACC 是否为 0 表 6-17 32 位 ACC 寄存器操作说明

MOVL ACC,loc32 MOVL loc32,ACC,COND

SUBBL ACC,loc32 SUBCU ACC,loc16 SUBCUL ACC,loc32 SUBL ACC,loc32 SUBL SUBL SUBL loc32,ACC ACC,P<<PM ACC,loc32

TEST ACC

助记符 ASR64 ACC:P,#1...16 ASR64 CMP64 LSL64 LSR64 NEG64 ACC:P,T ACC:P ACC:P,T ACC:P,T ACC:P

说明 64 位数值算术右移 1~16 位 按 T(5:0)对 64 位数值算术右移 比较 64 位数值 64 位数值逻辑左移 1~16 位 按 T(5:0)对 64 位数值逻辑左移 64 位数值逻辑右移 1~16 位 按 T(5:0)对 64 位数值逻辑右移 取 ACC:P 的相反数 根据 OVC 的值使 ACC:P 的值为饱和值 表 6-18 64 位 ACC 寄存器操作说明

LSL64 ACC:P,#1...16 LSR64 ACC:P,#1...16

SAT64 ACC:P

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

值。XT 寄存器的低 16 位部分是 TL 寄存器。该寄存器能装载一个 16 位有符号数,能自动对 该数进行符号扩展,然后将其送人 32 位 XT 寄存器。XT 寄存器的高 16 位部分是 T 寄存器。 该寄存器主要用来存储 16 位乘法操作之前的 16 位整数值。 T 寄存器也可以为一些移位操作 设定移位值,在这种情况下,根据指令,只可以使用 T 寄存器的一部分。具体的操作说明看 表 6-19. 助记符 ADDUL MAXCUL MINCUL MOV MOV MOV MOV MOV MOVA MOVDL P,loc32 P,loc32 P,loc32 说明 无符号数[loc32]加到寄存器 P 有条件地求无符号数[loc32]和 P 的最大值,存储到 P 有条件地求无符号数[loc32]和 P 的最小值,存储到 P [loc16]加载 PH [loc16]加载 PL 存储移位后的 P 寄存器的低 16 位 [loc16]加载到 T 存储 T 寄存器到 loc16 清除 TL [loc16]加载到 T 寄存器并与先前的乘积相加 存储 XT 寄存器并加载新 XT 寄存器 保存 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] 表 6-19 P 或 XT 的操作的说明 6.对中断控制寄存器的操作(IFR、IER、DBGIER) C28x 有 3 个寄存器用于控制中断:中断标志寄存器(IFR)、中断使能寄存器(IER)和调 试中断使能寄存器(DBGIER)。IFR 包含的标志位用于可屏蔽中断(可以用软件进行屏蔽)。当 通过硬件或软件设定了其中某位时, 则相应的中断就被使能。 可以用 IER 中的相应位屏蔽和 使能中断。当 DSP 工作在实时仿真模式并且 CPU 被挂起时,DBGIER 表明可以使用时间临近 中断(如果被使能)。具体操作看表 6-20。 助记符 AND AND IACK IER,#16bit IFR,#16bit #16bit 说明 按位进行“与”操作来禁止指定的 CPU 中断 按位进行“与”操作来清除挂起的 CPU 中断 中断确认 仿真硬件中断 加载中断允许寄存器

PH,loc16 PL,loc16 T,loc16 loc16,T TL,#0 T,loc16 XT,loc32

MOV loc16,P

MOVH loc16,P MOVL P,loc16 MOVL loc16,P MOVL loc32,P MOVL P,loc32 MOVL XT,loc32 MOVL MOVS MOVX SUBUL loc32,XT T,loc16 TL,loc16 P,loc32 MOVP T,loc16

INTR INT1/.../INT14、NMI、EMUINT、 DLOGINT、RTOSINT、 MOV IER,loc16

MOV OR OR TRAT

loc16,IER IER,#16bit IFR,#16bit #0...31

存储中断允许寄存器 按位相“或” 按位相“或” 软件陷阱 表 6-20 中断寄存器的操作说明

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

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

图 6-5 状态寄存器 ST1 的位分布 助记符 CLRC CLRC mode XF 清除各状态位 清除状态位 XF 并输出信号 清除 AMODE 位 清除 AMODE 状态位 清除 OBJMODE 位 清除 M0M1MAP 位 清除 OVC 位 清除 OVC 位 禁止屏蔽中断(置 INTM 位) 允许可屏蔽中断(清除 INTM) 令乘积移位方式位 PM=AX(2:0) 用指定单元高 6 位数加载溢出计数器 用指定单元低 6 位数加载溢出计数器 存储溢出计数器 存储溢出计数器到指定单元的低 6 位并且高 10 位清 0 置各状态位 OVC,loc16 OVC,loc16 loc16,OVC loc16,OVC Mode 说明

CLRC AMODE C28ADDR CLRC OBJMODE C27MAP CLRC OVC ZAP DINT EINT MOV PM,AX MOV MOVU MOV MOVU SETC OVC

SETC C28MAP

XF

置 XF 位并输出信号 置 M0M1MAP 位 置 M0M1MAP 位 置 OBJMODE 位 置 AMODE 位 置 AMODE 位 设置乘积移位方式 表 6-21 状态寄存器操作说明

SETC M0M1MAP SETC OBJMODE SETC AMODE LPADDR SPM PM

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

MPYA P,loc16,#16bit

XMAC P,loc16,*(pma)

IMPXUL P,XT,loc32

QMPYSL

P,XT,loc32

有符号 32 位数乘法(高半段)且减去先前 P 的内容 有符号 32 位数*无符号 32 位数(高半段) 表 6-23 32*32 乘法操作说明

QMPXUL P,XT,loc32

10.直接寄存器操作(见表 6-24) 助记符 ADD AND CMP DEC INC MOV MOV OR TBIT TBIT TCLR TSET XOR loc16,#16bit loc16,#16bit loc16,#16bit loc16 loc16 loc16,16bit loc16,#0 loc16,#16bit loc16,#bit loc16,T loc16,#bit loc16,#bit loc16,#16bit 说明 有符号 16 位立即数与[loc16]相加,结果保存到 loc16 有符号 16 位立即数与[loc16]按位“与” ,结果保存到 loc16 有符号 16 位立即数与[loc16]比较 [loc16] 减 1 [loc16-1]=[loc16] [loc16]加 1 16 位地址指向存储单元的内容加载到 loc16 存储 16 位立即数到 loc16 清除[loc16] 有条件存储 8 位立即数(零扩展)到 loc16 [loc16]和 16 位立即数按位“或” ,结果保存到 loc16 测试[loc16]中的指定位 测试[loc16]中由 T 寄存器指定的内容 测试并清除[loc16]中的指定位 测试并置[loc16]中的指定位为 1 [loc16]和 16 位立即数按位“异或” 表 6-24 对直接存储器操作的说明 11.对 I/O 空间操作的说明(看表 6-25) 助记符 IN OUT loc16,*(PA) *(PA),loc16 说明 从端口输入数据 从端口输出数据 想 I/O 端口输出不受保护的数据

DMOV loc16 MOV loc16,*(0:16bit)

MOVB loc16,#8bit,COND

UOUT *(PA),loc16

表 6-25 I/O 空间操作的说明 12.程序空间的操作说明(看表 6-26) 助记符 PREAD PWRITE XPREAD XPREAD XPWRITE loc16,*XAR7 *XAR7,loc16 loc16,*AL loc16,*(pma) *AL,loc16 说明 将 XAR7 指向的程序空间的 16 位数据放到 loc16 将[loc16]放到 XAR7 指向的程序空间的一个存储单元 与 C2xLP 兼容性的读程序操作 与 C2xLP 兼容性的读程序操作 与 C2xLP 兼容性的写程序操作 表 6-26 程序空间操作的说明 13.跳转/调用/返回操作(看表 6-27) 助记符 B 16bitoff,COND 说明 有条件跳转,PC=PC+16 位偏移地址(-32768~+32767)

BANZ BAR FFC IRET LB LB LC LC

16bitoff,ARn-16bitoff,ARn,ARm,EQ/NEQ XAR7,22bitoff 22bitAddr *XAR7

若辅助寄存器为 0,进行跳转,PC 变化同上 根据辅助寄存器比较进行跳转,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 的长返回

BF 16bitoff,COND

22bitAddr *XAR7

LCR *XARn LCR 22bitAddr LOOPZ LOOPNZ lLRET LRETE LRETR RPT SB XB XB XB XB #8bit/loc16 #8bitoff,COND pma pma,COND pma,*ARPn *AL loc16,#16bit loc16,#16bit

重复下一条指令 N 次,N 由 8 位立即数或[loc16]决定 有条件短跳转,PC 变化同上 快速有条件跳转,PC 变化同上 与 C2xLP 兼容性的跳转 与 C2xLP 兼容性的有条件跳转 与 C2xLP 兼容性的功能调用跳转 与 C2xLP 兼容性的功能调用 与 C2xLP 兼容性的功能调用且改变 ARP 若 ARn 不为 0,与 C2xLP 兼容性的跳转 与 C2xLP 兼容性的调用 与 C2xLP 兼容性的条件调用 与 C2xLP 兼容性的间接调用 等效于 XRETC UNC 与 C2xLP 兼容性的条件性返回 表 6-27 跳转/调用/返回操作的说明

SBF #8bitoff,EQ/NEQ/TC/NTC

XCALL pma,*ARPn XBANZ pma,*ind{,ARPn} XBCALL pma, XCALL XCALL XRET XRETC COND pma,COND *AL

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

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 ;用 016h 初始化一个字 .word 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。 十进制整数由 0~9 组成的字符串。 (3)十进制整数: 以字母 D(或 d)结尾(也可以默认), 范围从-2147483648~4294967295,如-300000. (4)十六进制整数: 以字母 H(或 h)结尾, 有十六进制数字由 0~9 和 A~F(或 a~f)组成 的字符串。数字串长度最多可达 8 各十六进制数字。 每个字符表示为 8 位 ASCII 码, (5)字符常数: 包含在单引号中的一个或两个字符的串。 如‘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]] “[]”内的部分是可选的。如 3.0、3.14、-0.314e13. 其中 N 表示十进制数字, ②字符串 字符串是包含在双引号内的一串字符, 双引号是字符串的一部分。 串的最大长度是变化 的,并由每一个使用字符串的伪指令定义的。字符在内部被定义为 8 位 ASCII 字符,如: “sample program”定义 13 个子的字符串 sample program。 字符串用与下列场合: (1).copy "filename"中的文件名; (2).setc "section name"中的段名; (3).byte "charstring"中断数据初始化伪指令; (4).string 伪指令的操作数。 字符串与字符常熟不同,字符常熟代表一个单独的整数值,而字符串是字符的列表。

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

6.4.3 表达式与运算符
? ? ? ? 表达式由运算符、常数和符号组成。有效表达式的范围是-32768~+32767。表 5-29 将 表达式内部使用的运算符按优先级分组列出。 组 1 运算符 + ~ * / % << >> + ^ | & < > <= >= =或== != 说明 取正 取负 求反(1 的补码) 乘 除 求模 左移 右移 加 减 按位逻辑异或 按位逻辑或 按位逻辑与 小于 大于 小于或等于 大于或等于 等于 不等于 优先级 高

2

3

4



表 6-29 表达式内使用的运算符说明 提示: (1)同组运算符的优先级以在前的为优; (2)第一组运算符从右到左求值,其他组成从左到右 本章阐述了 C28x 系列 DSP 的寻址方式和汇编指令,并简单介绍了汇编程序的格式。许 多情况向 C28x 的编程都可以使用 c 语言,因此初学者不必死记硬背汇编指令,理解汇编指 令,只要能读懂汇编指令即可。希望读者们能通过本章的学习熟练掌握 C28x 的各种寻址方 式,掌握常用湖边指令的功能和语法,汇编语句的格式,掌握 CPU 的工作原理,这样能有助 于在开发 DSP 系统时写出高效优质的代码。 ? ?

?

?

?


推荐相关:

DSP试卷及答案

TMS320VC5402 型 DSP 汇编语言的寻址方式可以实现 FFT 算法中的位倒序寻址方式...6. 简述 TI 公司 C2000, C5000, C6000 系列处理器的应用范围。 答:C2x、C...


2812中的EALLOW指令

在设置完寄存器之后,一定要注意执行汇编指令 asm(“EDIS”)或者 宏定义 EDIS ...已传到咱们的群里了,有没在群里的同学可以上网上找《DSP c2000 程序员高手...


DSP复习文档终极版

? TI 公司的三大主力系列 DSP 芯片 C2x、C24x 称为 C2000 系列,定位于控制...? 汇编源程序的工程文件的组成、C 程序的工程文件的组成 C 语言:.c .cmd ....


TI公司三大系列DSP芯片指令系统比较

三、TI 公司三大系列 DSP 芯片指令系统比较 1、C2000系列芯片(以TM S320...(1024-1) READA *AR2 + ⑸汇编指令 服务于汇编器,不产生指令代码...


献给初学者DSP入门教程

是针对控制应用最佳化的 DSP,在 TI 所有的 DSP 中,只有 C2000 有 FLASH,也...2)C 和汇编的编程指南需要看 3)汇编指令和 C 语言的运行时间支持库、DSPLIB ...


DSP技术复习

简述 TI 公司 C2000/C5000/C6000 系列 DSP 的特点及主要用途? 1. C2000 系列...3、包含有一 个汇编指令的语句必须在一行完全指定。 4、每个区必须使用一个...


DSP入门必须掌握知识点

是针对控制应用最佳化的 DSP,在 TI 所有的 DSP 中,只有 C2000 有 FLASH,也...2)C 和汇编的编程指南需要看 3) 汇编指令和 C 语言的运行时间支持库、DSPLIB...


浅谈'C2000、'C5000、'C6000的内部结构和区别

浅谈C2000、C5000 和 C6000 的内部结构和区别摘要: 德仪公司的 DSP 分为多种...两个系列 在执行代码级是兼容的, 但他们的汇编指令系统却不同。 C5000 包含的...


DSP知识要点

具有特殊的 DSP 指令 6.快速的指令 周期 7.硬件...C24x 称为 C2000 系列,定位于控制类和运算量较小...能分析常见的汇编程序、能编写简单的程序片断 整数...


DSP入门教程

是针对 控制应用最佳化的 DSP,在 TI 所 有的 DSP 中,只有 C2000 有 FLASH...2)C 和汇编的编程指南需要看 3)汇编指令和 C 语言的运行时间支持库、DSPLIB ...

网站首页 | 网站地图
3986 3986.net
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com