DSPC2000汇编指令
代码生成工具编译生成的。 在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。
本节假设条件为芯片工作于 C28x 模式(OBJMODE=1,AMODE=0)。复位后,通过执行指令 C28OBJ 或者 SETC OBJMODE 将 ST1 中的 OBJMODE 位置 1,芯片即可工作于 C28x 模式。
测试标志位
0000 NEQ 不等于
Z=0
0001 EQ
等于
Z-1
0010 GT
大于(有符号减法)
Z=0 且 N=1
0011 GEQ 大于或等于(有符号减法) N=0
0100 LT
小于(有符号减法)
N=1
0101 LEQ 小于或等于(有符号减法) Z=1 或 N=1
0110 HI
高于(无符号减法)
C=1 且 Z=0
BIO=0
1111 UNC 无条件
表 6-2 影响指令的判断条件的说明
在汇编程序当中实现乘法操作时一件非常不简单的事,由于是属于纯寄存器操作,因此, 开发人员需要准备保存乘法结果的地址,在表 6-1 当中讲解操作数符号的时候有一个关于乘 积操作的符号—PM,那么它的结果保存是如何执行的呢?下面通过表 6-3 来说明一下。
6.2 寻址方式
通过 6.1 节当中读者们应当对汇编语言编程有了一定的了解,仅仅了解了汇编语言的操 作符还是不过的,接下来就从汇编语言最根本的开始学习——寻址方式寻址方式就是寻找操 作数或者操作数地址的方式,在存储器中,操作数或指令字写入或读出的方式,有地址指定 方式、相联存储方式或堆栈存取方式。几乎所有的计算机,在内存中都采用地址指定方式。 当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。C28x 系列 DSP 的指 令集采用 7 种寻址方式: 1. 直接寻址方式:DP(数据页指针),在此方式中,16 位的 DP 寄存器被当做一个固定的
0111 HIS,C 高于或相同(无符号减法) C=1
1000 LO,NC 低于(无符号减法)
C=0
1001 LOS 低于或相同(无符号减法) C=1 或 Z=0
1010 NOV 无溢出
V=0
1011 OV
溢出
V=1
1100 NTC 测试位为 0
TC=0
1101 TC
测试位为 1
TC=1
1110 NBIO BIO 输入等于零
表 6-3 PM 与结果保存方式的关系
6.1.2 汇编语法指令描述
前一小节提到过,汇编指令一般都由操作符和操作数组成,操作符也被称为指令助记符, 它是指令中的关键字,表示本条指令操作类型,不能省略。操作数可以省略,也可以有很多, 但各操作数之间要用“,”分开。指令助记符与操作数之间要用空格分开。
ARn: n 为数值 0~7,ARn 指定下次的辅助寄存器。 ind: 选择一下 7 种符号之一:*,*+,*-,*0+,*0-,*BR0+,*BR0-(兼容模式使用)。 #:立即寻址方式中常用的前缀。数值前面带“#”,表示该数值为一个立即数。 <<左移。 >>右移。
表示这个单元内的 16/32 位数据。
在寄存寻址方式下, loc16/loc32 表示一个 16 位或 32 位寄存器(如 ACC、P、XT、AH
等), [loc16]/[loc32]表示这些寄存器内的 16/32 位数据。
ARn,ARm 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 {} = ==
6.1.1 DSP中的操作数
汇编语言离不开操作符和操作数,操作符可以认为就是 CPU 的指令或者编译器上的伪指
令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。
如表 6-1,表 6-2 和表 6-3 对指令中常用到的一些操作数符号进行说明
符号
描述
XARn
32 位辅助寄存器 XAR0~XAR7
页指针,讲指令中提供 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. 字节寻址方式:该方式能访问到股东地址单元的最低有效位和最高有效位。
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)
@: 当使用 C28x 语法时,64 位字段数据与通过“@”符号来表示,一帮组程序员理解当前正在 使用哪种寻址模式。
@@: 当使用 C28x 语法时,128 位字段数据页通过“@@”符号来表示。 loc16:16 位寻址方式指定地址单元的内容。 loc32:32 位寻址方式指定地址单元的内容。 #16bitsigned:16 位有符号立即数。
第六章 DSP的寻址方式和汇编指令
当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。根据 程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。汇 编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种 操作。在本章节当中将主要以基于 C28x 的 DSP 芯片为例,为读者讲解 DSP 的寻址方式和汇 编指令系统,其中大部分内容也可适用于其他 Ti 公司的 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 的所有有效特性、寻址方式和指令系统,
地址对应的 16/32 位数据。以上 7 种寻址方式都与“loc16/loc32”组合起来使用。
在间接寻址方式下,loc16/loc32 表示放在辅助寄存器(XAR0~XAR7)中的一个地址,
[loc16]/[loc32]表示这个地址对应的 16/32 位数据。
在堆栈寻址方式下,loc16/loc32 表示堆栈指针指向的一个堆栈单元,[loc16]/[loc32]
因此,一般应使 C28x 芯片工作于该种模式。 2. C27x 目标——兼容模式:在复位时,C28x 的 CPU 处于 C27x 目标-兼容模式。在该模式
下,目标码与 C27xCPU 完全兼容,且它的循环—计数也与 C27xCPU 兼容。 3. C2xLP 源——兼容模式:该模式允许用户运行 C2xLP 的源代码,这些源代码是用 C28x
[loc16]表示 loc16 这种寻址方式对应的 16 位数据。
2. loc32:为32位数据访问选择直接/堆栈/间接/寄存器寻址方式。
[loc32]表示 loc32 这种寻址方式对应的 32 位数据。
在直接寻址方式下,loc16/loc32 指的是一个用标号表示的地址和操作码内 8 位字段的 6 位或 7 位偏移量共同决定。[loc16]/[loc32]表示这个
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…) 可选字段 赋值 等于