Download presentation
Presentation is loading. Please wait.
Published byKarola Siegel Modified 5年之前
1
第3章 汇编语言指令系统 在DSP应用中,虽然可以使用C/C++高级语言编程,降低了对编程者的要求,但在一些实时性要求高的场合仍然需要采用汇编编程,以充分利用DSP丰富的硬件资源,发挥它的实时运算能力。 用汇编语言编程,要求编程者对DSP的低层有充分的了解,包括硬件结构、存储器空间模型和I/O口的组织等。同时又要求编程者对指令系统有深刻的了解。 山东大学生物医学工程刘忠国
2
第3章 汇编语言指令系统 3.1 C54x汇编语言指令集介绍 3.2 寻址方式 3.3 C54x系列DSP的指令系统
第3章 汇编语言指令系统 3.1 C54x汇编语言指令集介绍 3.2 寻址方式 3.3 C54x系列DSP的指令系统 参考:TMS320C54x DSP Reference Set Volume 2: Mnemonic Instruction Set.pdf, spru172c, 2001, TI官网
3
3.1 C54x汇编语言指令集介绍 C54x汇编语言源程序指令包括:
汇编语言指令Assembly Language Instructions 汇编伪指令Assembler Directives 宏指令Macro Directives 本章介绍C54x DSP的汇编语言指令系统。与其它CPU的指令集相同,汇编语言指令又称为硬指令,它们在汇编和连接后形成可执行的机器码,供DSP进行运算和其它操作。 TMS320C54x assembly language source programs consist of source statements that can contain assembler directives, assembly language instructions, macro directives, and comments. TMS320C54x Assembly Language Tools User’s Guide--SPRU102F
4
3.1 C54x汇编语言指令集介绍 3.1.1 指令系统中的符号、缩写及操作符 序号 符 号 含 义 1 A 累加器A 2 ALU
符 号 含 义 1 A 累加器A 2 ALU 算术逻辑运算单元 3 AR 泛指通用辅助寄存器 4 ARx 指定某一辅助寄存器AR0~AR7 5 ARP ST0中的3位辅助寄存器指针 6 ASM ST1中的5位累加器移位方式位-16~15 7 B 累加器B 8 BRAF ST1中的块重复操作标志位 9 BRC 块重复操作计数器 10 BITC或bit_code 用于测试指令,指定数据存储器单元中的哪 一位被测试,取指范围:0~15 BIT Xmem, BITC
5
3.1.1 指令系统中的符号、缩写及操作符 (续) 3.1 C54x汇编语言指令集介绍 序号 符 号 含 义 11 C16
符 号 含 义 11 C16 ST1中的双16位/双精度算术运算方式位 12 C ST0中的进位位 13 CC 2位条件码(0CC3) CMPR CC, ARx 14 CMPT ST1中的ARP修正方式位 15 CPL ST1中的直接寻址编辑标志位 16 cond 表示一种条件的操作数,用于条件执行指令 17 [d],[D] 延时选项 18 DAB D地址总线 19 DAR DAB地址寄存器 20 dmad 16位立即数数据存储器地址(0~65535)
6
3.1.1 指令系统中的符号、缩写及操作符 (续) 3.1 C54x汇编语言指令集介绍 序号 符 号 含 义 21 Dmem
符 号 含 义 21 Dmem 数据存储器操作数 22 DP ST0中的数据存储器页指针(0DP511) 23 Dst 目的累加器(A和B) 24 dst_ 与dst相反的目的累加器 25 EAB E地址总线 26 EAR EAB地址寄存器 27 extpmad 23位立即数程序存储器地址 28 FRCT ST1中的小数方式位 29 hi(A) 累加器A的高阶位(AH或BH) 30 HM ST1中的保持方式位
7
3.1.1 指令系统中的符号、缩写及操作符 (续) INTR K; 0 ≤K ≤31 TRAP K; 0 ≤K ≤31
3.1 C54x汇编语言指令集介绍 3.1.1 指令系统中的符号、缩写及操作符 (续) 序号 符 号 含 义 31 IFR 中断标志寄存器 32 INTM ST1中的中断屏蔽位 33 K 少于9位的短立即数 34 k3 3位立即数(0k37) LD #k3, ARP 35 k5 5位立即数(-16k515) LD #k5, ASM 36 k9 9位立即数(0k9511) LD #k9, DP INTR K; 0 ≤K ≤31 TRAP K; 0 ≤K ≤31 IDLE K; 1 ≤K ≤3 LD #K, dst; 0 ≤K ≤255 RPT #K; 0 ≤K ≤255 FRAME K; –128 ≤K ≤127 37 lk 16位长立即数 38 Lmem 利用长字寻址的32位单数据存储器操作数 39 mmr,MMR 存储器映像寄存器 40 MMRx,MMRy 存储器映像寄存器,AR0~AR7或SP MVMM MMRx, MMRy
8
3.1.1 指令系统中的符号、缩写及操作符(续) 3.1 C54x汇编语言指令集介绍 序号 符 号 含 义 41 n
符 号 含 义 41 n XC指令后面的字数,取1或2 42 N 指定状态寄存器,N=0为ST0,N=1为ST1 43 OVA ST0中的累加器A溢出标志 44 OVB ST0中的累加器B溢出标志 XC n, cond [, cond [, cond] ] RSBX N, SBIT; 0SBIT15 45 OVdst 指定目的累加器(A或B)的溢出标志(注释中) 46 OVdst_ 另一个目的累加器(A或B)的溢出标志(注释中) 47 OVsrc 指定源累加器(A或B)的溢出标志(注释中) 48 OVM ST1中的溢出方式位 49 PA 16位立即数端口地址(0PA65535) 50 PAR 程序存储器地址寄存器
9
RND src [, dst] 3.1.1 指令系统中的符号、缩写及操作符 (续) 序号 符 号 含 义 51 PC 程序计数器 52
符 号 含 义 51 PC 程序计数器 52 pmad 16位立即数程序存储器地址(0pmad65535) 53 pmem 程序存储器操作数 54 PMST 处理器工作方式状态寄存器 55 prog 程序存储器操作数(c54x指令中没有使用) 56 [R] 舍入选项 57 rnd 舍入 ;Round的缩写 58 RC 重复计数器 59 RTN 快速返回寄存器 RND src [, dst] 60 REA 块重复结束地址寄存器 61 RSA 块重复起始地址寄存器 block-Repeat End Address register block-Repeat Start Address register
10
3.1.1 指令系统中的符号、缩写及操作符(续) 3.1 C54x汇编语言指令集介绍 序号 符 号 含 义 62 SBIT
符 号 含 义 62 SBIT 用于指定状态寄存器位的4位地址(0~15) 63 SHFT 4位移位值(0~15) 64 SHIFT 5位移位值(-16~15) RSBX N, SBIT; 0SBIT15 65 Sind 间接寻址的单数据存储器操作数 66 Smem 16位单数据存储器操作数 67 SP 堆栈指针寄存器 68 src 源累加器(A或B) BANZ[D] pmad, Sind(只出现于此指令) 69 ST0,ST1 状态寄存器0,状态寄存器1 70 SXM ST1中的符号扩展方式位 71 T 暂存器
11
3.1.1 指令系统中的符号、缩写及操作符(续) 3.1 C54x汇编语言指令集介绍 序号 符 号 含 义 71 T 暂存器 72 TC
符 号 含 义 71 T 暂存器 72 TC ST0中的测试/控制标志 73 TOS 堆栈顶部 74 TRN 状态转移寄存器(比较选择存储CSST单元内) CMPS src, Smem; 指令影响TRN(该寄存器用于Viterbi 算法) 75 TS 由T寄存器的5~0位所规定的移位数(-16~31) 76 uns 无符号数 77 XF ST1中的外部标志状态位 78 XPC 程序计数器扩展寄存器 79 Xmem 16位双数据存储器操作数, 用于双数据操作数指令和单数据操作指令 80 Ymem 16位双数据存储器操作数,用于双数据操作数指令
12
3.1.1 指令系统中的符号、缩写及操作符 (续) 序号 符 号 含 义 81 – –SP 堆栈指针值减1 82 ++SP 堆栈指针值加1
3.1 C54x汇编语言指令集介绍 3.1.1 指令系统中的符号、缩写及操作符 (续) 序号 符 号 含 义 81 – –SP 堆栈指针值减1 82 ++SP 堆栈指针值加1 83 ++PC 程序计数器值加1 + + PC只出现在Table 2–14. Interrupt Instructions( TMS320C54x DSP Reference Set Volume 2: Mnemonic Instruction Set--spru172c ) INTR K ; – –SP, + + PC = TOS(非常见注释), TRAP K ; – –SP, + + PC = TOS, 表示(SP) –1 →SP ;(PC) +1 →TOS(常用TOS= + + PC )
13
指令系统中的运算符号及优先级如表3-2中所示
3.1.1 指令系统中的符号、缩写及操作符 指令系统中的运算符号及优先级如表3-2中所示 序号 符 号 运算功能 求值顺序 1 + - ~ ! 取正、取负、按位求补、 逻辑非 从右至左 2 * / % 乘法、除法、求模 从左至右 3 + - 加法、减法 4 ^ 指数 从左到右 5 << >> 左移、右移 从左至右 6 < 小于、小于等于 从左至右 7 > 大于、大于等于 8 != 不等于 9 & 按位与运算(AND) 从左至右 10 ∧ 按位异或运算(exclusive OR) 11 | 按位或运算(OR)
14
3.1 C54x汇编语言指令集介绍 3.1.2 汇编语言指令举例 本节以LD装载指令为例,说明指令的格式和其它一些有用信息。
(1)LD Smem, dst 汇编语法 操作数 指令代码 执行 状态位 说明 指令字长 周期数 1 D I A (2)LD Xmem, SHFT, dst 1 D X S H F T (3)LD #lk [, SHFT ], dst 1 D S H F T 16-bit constant
15
3.1.2 汇编语言指令举例: LD命令 汇编语法 操作数
16
3.1.2 汇编语言指令举例: LD命令 指令代码
17
3.1.2 汇编语言指令举例: LD命令 指令代码
18
3.1.2 汇编语言指令举例: LD命令 执行 状态位 说明
19
3.1.2 汇编语言指令举例: LD命令 注意事项
20
3.1.2 汇编语言指令举例: LD命令 指令字长 周期数 类型
21
3.1.2 汇编语言指令举例: LD命令
22
3.1.2 汇编语言指令举例: LD命令
23
3.2 寻址方式 3.2 寻址方式 C54x的寻址方式共有下列7种: (1)立即寻址 (2)绝对寻址 (3)累加器寻址 (4)直接寻址
(5)间接寻址 (6)存储器映像寄存器寻址 (7)堆栈寻址
24
3.2.1 立即寻址 立即寻址是指指令中的操作数是一个立即数,用#表示 l 短立即数—3位(k3)、5位(k5) 、8位(K)或9位(k9)
l 长立即数—16(lk)位 LD #k3, ARP; 0 ≤K3 ≤7 LD #k5, ASM; -16 ≤K5 ≤15 LD #k9, DP; 0≤K ≤511 LD #lK [,SHFT], dst; LD #lK,16, dst; –32768≤lK≤32 767 INTR K; 0 ≤K ≤31 TRAP K; 0 ≤K ≤31 IDLE K; 1 ≤K ≤3 LD #K, dst; 0 ≤K ≤255 RPT #K; 0 ≤K ≤255 FRAME K; –128 ≤K ≤127 使用短(长)立即数的指令代码通常为一(两)个字长 例3-3 LD #4, DP ; 4→DP , 指令代码:EA04H LD #7850H,A ;7850H→A; 指令代码:F020H 7850H LD #78H,A ;78H→A; 指令代码:E850H
25
3.2.1 立即寻址 可使用立即寻址的指令及立即数的位数如下表所示: 3位或5位立即数 8位 立即数 9位 LD FRAME RPT
INTR TRAP IDLE 16位 立即数 ADD BITF OR ST ADDM CMPM ORM STM AND LD RPT SUB ANDM MAC RPTZ XOR XORM FRAME: Stack Pointer Immediate Offset; Syntax: FRAME K (SP)+K→SP
26
3.2 寻址方式 3.2.2 绝对寻址 绝对寻址有下列4种类型 : 数据存储器(dmad)寻址 程序存储器(pmad)寻址
I/O端口(PA)寻址 *(lk)寻址
27
3.2.2 绝对寻址 相关指令如下表所示: 绝对寻址方式 相关指令 数据存储器 (dmad)寻址 MVDK Smem, dmad MVDM dmad, MMR MVKD dmad, Smem MVMD MMR, dmad 程序存储器 (pmad)寻址 MVDP Smem, pmad MVPD pmad, Smem FIRS Xmem, Ymem, pmad pmad→PAR, While (RC)≠0, (B)+(A(32–16))×(Pmem addressed by PAR)→B, ((Xmem)+(Ymem))<<16→A, (PAR)+1→PAR, (RC) −1→RC (FIRS指令功能)
28
3.2.2 绝对寻址 绝对寻址方式 相关指令 程序存储器 (pmad)寻址 MACD Smem, pmad, src
MACP Smem, pmad, src I/O端口(PA)寻址 PORTR PA, Smem PORTW Smem, PA *(lk)寻址 可用于所有支持单数据操作数(Smem) 的指令 pmad→PAR, (Smem)×(Pmem addressed by PAR) +(src)→src, (Smem)→T, (Smem)→Smem+1, If (RC)≠0, (PAR)+1→PAR (MACD指令功能) MACP与MACD指令唯一的区别是不执行内存延迟 (Smem)→Smem+1。 MVDK *(200h),AR2
29
3.2 寻址方式 3.2.3 累加器寻址 有两条指令采用这种寻址方式 : 累加器寻址指令 解释 READA Smem
的数据存储器中 WRITA Smem 将Smem指定的数据存储器中的内容送入A所指出的程序存储器中 A(22-0)→PAR , (Smem) (Pmem addressed by PAR), If (RC)≠0, (RC)–1→RC , (PAR)+1→PAR 与重复指令RPT配合使用,便于两个空间的连续数据读写。
30
第3章 汇编语言指令系统 3.2.3 累加器寻址 例3-7 程序存储器中有一个常数表格,首地址为TABLE, 长度是10个字。要求把该表格读入首地址为BUFFER的数据存储器区中。 实现该功能的程序段如下: LD #TABLE,A ;#TABLE→A STM #BUFFER,AR3 ;#BUFFER→AR3 RPT #9 ;后面一条指令将运行10次, RC=9 READA *AR ; A →PAR, ((PAR))→(AR3) , ; (AR3)+1→AR3 ; If (RC)≠0, (RC)–1→RC,(PAR)+1→PAR
31
3.2 寻址方式 3.2.4 直接寻址 Direct Memory Address (dma, DMA) 7位
直接寻址是指利用指令中的地址偏移量dma与数据页指针DP或堆栈指针SP组合,找到数据空间中的一个16位地址的方式。 以DP和SP为基地址的直接寻址方式指令代码格式: 15 ~ 8 7 6 ~ 0 操 作 码 I = 0 数据存储器地址偏移(dma) I = 0表示直接寻址 ;I = 1表示间接寻址。
32
3.2 寻址方式 3.2.4 直接寻址 CPL=0时: 以DP为基地址的直接寻址方式 直接寻址 指 令 15~8 7 6~0 操作码 I=0
指 令 15~8 7 6~0 操作码 I=0 dma 页指针DP (位于ST0中) 9位数据页指针DP 16位数据 存储器地址 9位数据页指针DP dma 高9位 低7位
33
3.2 寻址方式 3.2.4 直接寻址 CPL=1时: 以SP为基地址的直接寻址方式 直接寻址 指 令 15~8 7 6~0 操作码 I=0
指 令 15~8 7 6~0 操作码 I=0 dmad 16位堆栈指针SP 堆栈指针SP + dmad 16位数据 存储器地址 16位: SP dmad 低7位
34
3.2 寻址方式 3.2.4 直接寻址 例3-8 下列程序段实现的功能是:将两个数据存储单元01E0h和01E1h中的内容相加,然后把结果送入A。 RSBX CPL ;CPL=0,采用DP方式。 LD #3,DP ;DP指向第3页。 LD @60h,A ;dma=60h,(01E0h)→A ADD @61h,A ; dma=61h , ((A))+(01E1h)→A @60h: dma DP @常省略。 16位数据 存储器地址 E h
35
3.2.5 间接寻址 间接寻址是指通过两个辅助算术逻辑单元ARAU0、ARAU1及8个辅助寄存器AR0~AR7,间接获得数据存储器地址的方式。 单操作数寻址 LD *AR1, A 双操作数寻址 MAC *AR5-, *AR4+[AR6],A, B
36
3.2.5 间接寻址 (1)单操作数间接寻址址 LD *AR1, A
单操作数寻址是一条指令中,只有一个存储器操作数(即从存储器中只存取一个操作数),其指令的格式: ~ 7 6 ~ 3 2 ~ 0 操 作 码 I = 1 MOD ARF Operand Address Modifications Auxiliary Register Field 其中: 2~0位定义寻址所用的辅助寄存器(如AR0~AR7)。 6~3位为地址调整,定义了间接寻址的类型(表3-4); 第7位I=1,表示指令的寻址方式为间接寻址; 15~8位是指令的操作码;
37
3.2.5 间接寻址 单操作数寻址: 单操作数寻址结构图如下所示. 操作数调整源
单操作数寻址: 单操作数寻址结构图如下所示. 操作数调整源 Auxiliary Register Arithmetic Units 操作 双操作数寻址无lk BK: Circular-buffer size register
38
3.2.5 间接寻址 表3-4 单操作数寻址 地址存放情况及地址调整功能共16种: 操作句法 功 能 说 明 * ARx 地址=ARx
单操作数寻址 地址存放情况及地址调整功能共16种: 操作句法 功 能 说 明 * ARx 地址=ARx ARx的内容为数据存储器地址 * +ARx ARx=ARx+1 地址=ARx+1 ARx中的地址加1后,再寻址,只用于写 * ARx- 地址=ARx ARx=ARx-1 寻址结束后,ARx地址减1 * ARx+ 地址=ARx ARx=ARx+1 寻址结束后,ARx地址加1 * ARx-0 地址=ARx ARx=ARx-AR0 寻址结束后,从ARx中减去AR0的值 * ARx+0 地址=ARx ARx=ARx+AR0 寻址结束后,把AR0加到ARx 中
39
3.2.5 间接寻址 单操作数寻址 表3-4(续) 操作句法 功 能 说 明 *ARx-0B 地址=ARx ARx=B(ARx-AR0)
功 能 说 明 *ARx-0B 地址=ARx ARx=B(ARx-AR0) 寻址结束后,用位倒序进位方法从ARx中减去AR0值 *ARx+0B ARx=B(ARx+AR0) 寻址结束后,用位倒序进位的方法将 AR0加到ARx中 *ARx-% 地址=ARx ARx=Circ(ARx-1) 寻址结束后,ARx中的地址值按循环减的方法减1 *ARx+% ARx=Circ(ARx+1) 寻址结束后,ARx中的地址值按循环加的方法加1 *ARx-0% 地址=ARx ARx=Circ(ARx-AR0) 寻址结束后,按循环减的方法从ARx中减去AR0中的值 *ARx+0% 地址=ARx ARx=Circ(ARx+AR0) 寻址结束后,按循环加的方法从AR0中的值加到ARx
40
3.2.5 间接寻址 单操作数寻址 表3-4(续) 操作句法 功 能 说 明 *ARx(lk) 地址=ARx+lk ARx=ARx
功 能 说 明 *ARx(lk) 地址=ARx+lk ARx=ARx 以ARx与16位数之和作为地址,寻址结束后,ARx中的值不变 $ *+ARx(lk) ARx=ARx+lk 将一个16位带符号数加到ARx,然后寻址 $ *+ARx(lk)% 地址=Circ(ARx+lk) ARx=Circ(ARx+lk) 将一个16位带符号数按循环加的方法加至ARx,然后再寻址$ * (lk) 地址=lk 利用16位无符号数作为地址,寻址数据存储器$ $不用于MMR
41
3.2 寻址方式 3.2.5 间接寻址 位反向寻址 位反向寻址是专门为快速傅立叶变换FFT而设计的。 例 3-9 求 b b
42
3.2.5 间接寻址 位反向寻址:4位二进制数的原始地址与位反向地址的对应关系如表3-5所示: 表3-5 正常顺序 原始地址 位反向地址
位反向顺序 0000 1 0001 1000 8 2 0010 0100 4 3 0011 1100 12 5 0101 1010 10 6 0110 7 0111 1110 14
43
3.2.5 间接寻址 位反向寻址 表3-5(续) 正常顺序 原始地址 位反向地址 位反向顺序 8 1000 0001 1 9 1001 10
1010 0101 5 11 1011 1101 13 12 1100 0011 3 14 1110 0111 7 15 1111
44
3.2.5 间接寻址 循环寻址 示意图: 使2 N﹥BK成立的最小N 低N位为0 例如: *AR1+%
BK=20, 则N=5,即基地址EFB的低5 位为0,设EFB=1000h。 在初始化编程中将20→BK; 地址指针为AR1, 1000h→AR1 地址索引index = index + step index: AR1的低5位 这里step = +1,当index变化到19(13h) 时,再做index = index + step时就会 使index等于BK里的值20, 因此进行index = index + step – BK 的操作,使得index=0,也就是使 AR1=1000h,又回到基地址EFB的位 置,从而形成了循环寻址。 使2 N﹥BK成立的最小N 低N位为0 EFB 0 <BK BK=20 EOB
45
3.2.5 间接寻址 循环寻址算法如下: If 0 index+step< BK; index=index+step;
Else if index+step BK; index=index+step-BK; Else if index+step < 0; index=index+step+BK。
46
3.2.5 间接寻址 ② 双操作数间接寻址 ADD Xmem,Ymem, dst ST src, Ymem || LD Xmem, dst
用途:用在完成两个读或一个读且一个写的指令中。 说明:该指令只有一个字长,只能以间接寻址的方式工作。 格式如下: 例如 ADD *AR2+0%, *AR3–, A 其中,15~8位:指令操作码; 7~6位为Xmod,定义用于访问Xmem操作数间接寻址方式的类型 (见表3-6);5~4位为Xar,确定了包含Xmem地址的辅助寄存器; 3~2位为Ymod,定义了用于访问Ymem操作数的间接寻址方式的类型;1~0位为Yar,确定了包含Ymem的辅助寄存器。 ST src, Ymem || LD Xmem, dst
47
3.2.5 间接寻址 ②双操作数寻址 双操作数寻址结构图如下所示: 双操作数寻址无lk
48
3.2.5 间接寻址 ②双操作数寻址 表3-6双操作数寻址有4种地址存放情况和地址调整功能 : Xmod or Ymod 操作码 语法
功 能 说 明 00 * ARx 地址=ARx ARx中的内容是数据存储器地址 01 * ARx- ARx=ARx-1 寻址后,ARx的地址减1 10 * ARx+ ARx=ARx+1 寻址后,ARx的地址加1 11 * ARx+0% ARx=circ(ARx+AR0) 寻址后,AR0以循环寻址方式加到ARx中去 BK=0, 循环寻址等效于非循环寻址。 * ARx+0%等效*ARx+0 失效
49
3.2.5 间接寻址–特别实例 例3-10 双操作数间接寻址指令举例 MAC[R] Xmem, Ymem, src [, dst ];
第3章 汇编语言指令系统 3.2.5 间接寻址–特别实例 例3-10 双操作数间接寻址指令举例 MAC[R] Xmem, Ymem, src [, dst ]; (Xmem) × (Ymem) + (src) → dst,(Xmem) → T 具体实现的指令如下: MAC *AR5+, *AR4+,A, B; ((AR5)) ×((AR4))+(A)→B, ((AR5))→T, (AR5)+1→AR5, (AR4)+1→AR4 ;
50
3.2 寻址方式 3.2.6 存储器映像寄存器寻址 存储器映像寄存器寻址是一种直接访问存储器映像寄存器MMR(地址00~7Fh)的方式,可以用来修改MMR的值。 有8条指令可以使用存储器映像寄存器寻址:
51
3.2 寻址方式 3.2.6 存储器映像寄存器寻址 LDM MMR,dst MVDM dmad,MMR MVMD MMR,dmad 存储器
MVMM MMRx,MMRy POPM MMR PSHM MMR STLM src,MMR STM #lk,MMR MMRx: AR0–AR7, SP MMRy: AR0–AR7, SP
52
3.2 寻址方式 3.2.7 堆栈寻址 下列4条指令使用堆栈寻址: 堆 栈 寻 址 PSHD Smem PSHM MMR POPD Smem
POPM MMR
53
3.3 C54x系列DSP的指令系统 3.3 C54x系列DSP的指令系统 C54x的汇编语言指令集共有129条基本指令,
按完成的功能可以分为6类: 数据存取指令 (共28条) 算术运算指令 (共42条) 逻辑运算指令(共17条) 控制程序转移指令(共31+3条) 重复操作指令(共3条(包含于上面类) 并行操作指令(共8条)
54
3.以上包括32位长操作数的加载、存储指令(2条)
3.3 C54x系列DSP的指令系统 3.3.1 数据存取指令 (表3-7 共28条) 本节只介绍非并行的数据存取指令,包括 : 1. 加载指令 (6条细分为21分条) 2. 存储指令 (10条细分为18分条) 4. 混合加载和存储指令(12条) 3.以上包括32位长操作数的加载、存储指令(2条) 1. 加载指令的 6条助记符(Mnemonics): LD(16分条), DLD, LDM,LDR, LDU, LTD
55
1. 加载指令 (共6条) LD Smem, dst 以累加器A或B为目标操作数的LD指令 LD Smem, TS, dst
1. 加载指令 (共6条) 以累加器A或B为目标操作数的LD指令 以累加器 A或B为 目标操作数 的LD指令 LD Smem, dst LD Smem, TS, dst LD Smem, 16, dst LD Smem [, SHIFT ], dst TS: T的5–0位表示的移位值 (–16≤TS≤31) LD Xmem, SHFT, dst (1条) LD #K, dst LD #lk [, SHFT ], dst LD #lk, 16, dst LD src, ASM [, dst ] LD src [, SHIFT ], dst
56
3.3 C54x系列DSP的指令系统 1. 加载指令 (共6条) 以暂存器 LD Smem, T
以暂存器T或ST0、ST1的DP、ASM及ARP字段为目标操作数的LD指令 以暂存器 T或ST0、 ST1的DP、 ARP及ASM字段为目标 操作数的 LD指令 LD Smem, T LD Smem, DP LD Smem, ASM (1条续) LD #k9, DP LD #k5, ASM LD #k3, ARP
57
1. 加载指令 (共6条) DLD Lmem,dst 32位长操作数的加载指令
dst = Lmem,将Lmem所指定的单数据存储器中的32位数据送入累加器A或B中。 功能: LDM MMR,dst dst = MMR 将MMR寄存器中的数据,送 入累加器dst。 功能: LDR Smem,dst dst(31-16)=(Smem)<<16, dst(15)=1,dst(14-0)=0; 功能: (Smem) << << 15 → dst(31–16) Load Memory Value in Accumulator High With Rounding
58
3.3 C54x系列DSP的指令系统 1. 加载指令 (共6条) LDU Smem,dst
功能:dst = uns(Smem) 将Smem所指定的单数据存储器的无符号数据,送入累加器。 LTD Smem 功能:T=Smem,(Smem+1)= Smem 将单数据存 储器Smem的数据,送入寄存器T,并memory delay。
59
1. 加载指令 (共6条) 例3.11 LD *AR3, A 1)当SXM=0时,进行无符号数的加载 指令执行前 指令执行后
数据存储器 0200H A6 A A6 SXM AR 数据存储器 0200H A6 2)当SXM=1时,进行有符号数的加载 指令执行前 指令执行后 A SXM AR 数据存储器 0200H A6 A FF FFFF 95A6 SXM AR 数据存储器 0200H A6
60
1.加载指令(共6条) 例3.12 LD A, 4, B 1) OVM=0时,对溢出不进行处理,仅通过OVB=1反映溢出 指令执行前
指令执行后 A FFF B FFFF OVB OVM A FFF 8000 B FFF OVB OVM 2) OVM=1时,对溢出进行处理: 指令执行前 指令执行后 A FFF B FFFF OVB OVM A FFF B FFF FFFF OVB OVM
61
直接寻址 ST1 1. 加载指令 例3.13 LD @0,ASM CPL=0 0001 0010 0011 0100 指令执行前 指令执行后
第3章 汇编语言指令系统 ST1 1. 加载指令 例 LD @0,ASM CPL=0 0180H 指令执行前 指令执行后 ASM DP 数据存储器 0180H ASM DP 数据存储器 0180H 16位数据 存储器地址 h DP @ 0 直接寻址 CPL=0
62
2. 存储指令 (共10条) (表3-7 ) 以累加器A, B或T, TRN, #lk, BRC为源操作数;
以数据存储器Smem, Xmem, Lmem或MMR为目标操作数; 存储指令的 10条助记符(Mnemonics): ST, STLM, STM , STH, STL, DST, CMPS, SACCD, SRCCD, STRCD 1: ST T, Smem 2: ST TRN, Smem 3: ST #lk, Smem; #有时可省略 1) ST
63
3.3 C54x系列DSP的指令系统 2. 存储指令 (共10条) STLM src, MMR;
赋值的指令 STLM src, MMR; MMR = src(15-0),将累加器的低16 位送入MMR,是1字1周期指令。 STM #lk, MMR; MMR = #lk, 将长立即数送入MMR,是2字2周期指令。
64
2. 存储指令 (共10条) 2) 为MMR赋值的指令 例 3.14 STLM A, *AR2 指令执行前 指令执行后
AR5(15h) F69 A AR AR STLM和STM 可访问位于数据存储器 0页上的MMR 和暂存寄存器0060h~007Fh。对其进行直接寻址或间接寻址时,不管当前DP或 ARx的值如何,在指令执行后,DP值或ARx的高9位都被强制清0.
65
2. 存储指令 2) 为MMR赋值的指令 例 3.15 STM #1357H, *AR4+ 指令执行前 指令执行后 AR0 0000
STM #lk, MMR; #有时可省略 例 STM #2468H, 60H 指令执行前 指令执行后 0060H 0060H
66
3.3 C54x系列DSP的指令系统 2. 存储指令 (共10条) STH src, Smem STH src, ASM, Smem
3) STH和STL指令 STH和 STL指令 STH src, Smem STH src, ASM, Smem STH src, SHFT, Xmem STH src [, SHIFT ], Smem STL src, Smem STL src, ASM, Smem STL src, SHFT, Xmem STL src [, SHIFT], Smem
67
2. 存储指令 (共10条) 3) STH和STL指令 例 3.17 设累加器(A)=FF 9876 5432H STL A,8,da
(da)=3200H STL A,-8,da (da)=7654H STH A,8,da (da)=7654H (da)=FF98H STH A,-8,da (da)=00FFH (SXM=0) STH A,-16,da (da)=FFFFH (SXM=1) STH A,-16,da If SXM = 0, bit 39 of src is copied in the MSBs of the data-memory location. If SXM = 1, the sign-extended value with bit 39 of src is stored in the MSBs of the data-memory location after being right-shifted by the exceeding guard bit margin.
68
CMPS src, Smem;比较选择累加器(src)的高、低字 值,把最大值放到存储器(Smem)中;
4)比较选择存储与条件存储指令: CMPS src, Smem;比较选择累加器(src)的高、低字 值,把最大值放到存储器(Smem)中; SACCD src, Xmem, cond; if(cond), Xmem= src<<(ASM-16) , cond:AEQ ANEQ AGT AGEQ ALT ALEQ SRCCD Xmem, cond; if(cond) Xmem= BRC STRCD Xmem, cond; if(cond) Xmem= T 移位后src的低字 值 例: SACCD A, *AR3+, ALT 移位后src的低字 值 A=FF FE00 C321 ASM=01 AR3=0202 *(0202)=0101 A=FF FE00 C321 ASM=01 AR3=0202 *(0202)=FC01
69
3.3 C54x系列DSP的指令系统 DLD Lmem, dst 3. 32位长操作数的加载、存储指令及数据存放格式
3. 32位长操作数的加载、存储指令及数据存放格式 32位 长操作数 的加载、 存储指令 及数据 存放格式 DLD Lmem, dst 在单周期内同时利用CAB、CB和AB、DB总线将32位Lmem读入累加器。是1字1周期指令。 DST src, Lmem 两次使用EAB、EB总线将累加器的内容分别写入高16位和低16 位数据存储器。是1字2周期指令。
70
3.3 C54x系列DSP的指令系统 3. 32位长操作数的加载、存储指令及数据存放格式 长操作数指令中给出的地址总是指向数据高有效字
3. 32位长操作数的加载、存储指令及数据存放格式 长操作数指令中给出的地址总是指向数据高有效字 C54x的32位长操作数有两种数据存放格式: 偶地址存放和奇地址存放 偶地址存放是指数据的高有效字存放在偶地址且是较低的地址,低有效字存放在奇地址且是较高的地址 奇地址存放是指数据的高有效字存放在奇地址且是较高的地址,低有效字存放在偶地址且是较低的地址 一般推荐使用偶地址存放格式
71
例3-18 存放格式对数据存储的影响 DST B, *AR3+
1) 偶地址存放 指令执行前 指令执行后 B CAC BD90 AR 数据存储器 0100H 0101H B CAC BD90 AR 数据存储器 0100H CAC 0101H BD90 2) 奇地址存放 指令执行前 指令执行后 B CAC BD90 AR 数据存储器 0100H 0101H B CAC BD90 AR 数据存储器 0100H BD90 0101H CAC
72
例3-19 存放格式对数据加载的影响 DLD *AR3+, B
1) 偶地址存放 指令执行前 指令执行后 B AR 数据存储器 0100H CAC 0101H BD90 B CAC BD90 AR 数据存储器 0100H CAC 0101H BD90 2) 奇地址存放 指令执行前 指令执行后 B AR 数据存储器 0100H CAC 0101H BD90 B BD90 6CAC AR 数据存储器 0100H CAC 0101H BD90
73
4. 混合加载和存储指令(共12条) 绝对寻址方式 相关指令 数据存储器 (dmad)寻址 MVDD Xmem, Ymem
4. 混合加载和存储指令(共12条) 绝对寻址方式 相关指令 数据存储器 (dmad)寻址 MVDD Xmem, Ymem MVMM MMRx, MMRy MVDK Smem, dmad MVKD dmad, Smem MVDM dmad, MMR MVMD MMR, dmad 程序存储器 (pmad)寻址 MVDP Smem, pmad MVPD pmad, Smem I/O端口(PA)寻址 PORTR PA, Smem PORTW Smem, PA
74
3.3 C54x系列DSP的指令系统 4. 混合加载和存储指令 累加器寻址指令 解释 READA Smem A中内容为程序存储器地址,将
4. 混合加载和存储指令 累加器寻址指令 解释 READA Smem A中内容为程序存储器地址,将 该地址中的数据送入Smem指定 的数据存储器中 WRITA Smem 将Smem指定的数据存储器中的内容送入A所指出的程序存储器中 A→PAR , (Pmem addressed by PAR) (Smem), If (RC)≠0, (RC)–1→RC , (PAR)+1→PAR
75
3.3 C54x系列DSP的指令系统 3.3.2 算术运算指令(共42条) C54x的算术运算指令包括: 基本算术运算指令 (共12条)
特殊运算指令 (共15条) 双字(32位)算术运算指令 (共6条) 乘累加和乘累减指令 (共9条)
76
基本算术运算指令(共12条) 加法指令 操作 字数 周期数 ADD Smem , src src=src+Smem 1
ADD Smem , TS,src src=src+Smem<<TS ADD Smem ,16 ,src[,dst] dst=src+Smem<<16 ADD Smem,[,SHIFT],src[,dst] dst=src+Smem<< SHIFT 2 ADD Xmem ,SHFT ,src src=src+Xmem<< SHFT 1 ADD Xmem ,Ymem ,dst dst=Xmem<<16+Ymem<<16 1 ADD #lk,[,SHFT],src[,dst] dst=src+#lk<< SHFT 2 ADD #lk,16,src[,dst] dst=src+#lk<< 16 ADD src,[,SHIFT][,dst] dst=dst+src<< SHIFT 1 2 ADD src,ASM[,dst] dst=dst+src<< ASM ADDC Smem , src src=src+Smem+C 1 ADDM #lk, Smem Smem=Smem+#lk 2 ADDS Smem , src src=src+uns(Smem) 1
77
基本算术运算指令(共12条)(续) 减法指令 操作 字数 周期数 SUB Smem , src src=src-Smem 1
SUB Smem , TS,src src=src-Smem<<TS SUB Smem ,16 ,src[,dst] dst=src-Smem<<16 SUB Smem,[,SHIFT],src[,dst] dst=src-Smem<< SHIFT 2 SUB Xmem ,SHFT ,src src=src-Xmem<< SHFT 1 SUB Xmem ,Ymem ,dst dst=Xmem<<16-Ymem<<16 1 SUB #lk,[,SHFT],src[,dst] dst=src-#lk<< SHFT 2 SUB #lk,16,src[,dst] dst=src-#lk<< 16 SUB src,[,SHIFT][,dst] dst=dst-src<< SHIFT 1 SUB src,ASM[,dst] dst=dst-src<< ASM SUBB Smem , src src=src-Smem-C 1 SUBC Smem,src (用于除法) If(src-Smem<<15)≥0, src=(src-Smem<<15)<<1+1 Else src=src<<1 1 SUBS Smem , src src=src-uns(Smem) 1
78
基本算术运算指令(共12条)(续) 乘法指令 操作 字数 周期数 MPY Smem , dst dst=T*Smem 1
MPYR Smem , dst dst=rnd(T*Smem) MPY #lk ,dst dst= T*#lk 2 MPY Smem ,#lk ,dst dst= Smem *#lk ,T=Smem 2 MPY Xmem ,Ymem ,dst dst= Xmem *Ymem,T=Xmem 1 MPYA dst dst=T*A(32-16) 1 MPYA Smem B= Smem*A(32-16),T=Smem MPYU Smem , dst dst=uns(T )*uns(Smem) 1 SQUR Smem , dst dst= Smem *Smem ,T=Smem 1 SQUR A , dst dst=A(32-16)*A(32-16) 1
79
基本算术运算指令 例3-20 设被除数1000在数据空间0060h单元中,除数5在0061h中。用条件减法指令SUBC完成16位/16位无符号数除法1000÷5,并将结果存放在0062h单元。 实现的程序段如下: RSBX SXM ;无符号数除法,不进行符号扩展 STM #0060h, AR1 ;地址指针指向被除数 LD *AR1+, A ;被除数1000(3E8h)→A RPT # ;下条指令重复执行16次 SUBC *AR1 , A ;进行条件减法 MAR *AR ; AR1+1指向商单元,因不能在前行调整AR1 STL A, *AR ;将商装入0062h单元 If (src-Smem<<15)≥0, src=(src-Smem<<15)<<1+1 Else src=src<<1
80
调试程序时可增加存储被除数、除数的指令和loop循环
例3-20 设被除数1000在数据空间0060h单元中,除数5在0061h中。用条件减法指令SUBC完成16位/16位无符号数除法1000÷5,并将结果存放在0062h单元。 ;助记符不能顶格书写 ST #03E8h, *(0060h) ;0060h存储被除数 ST #05h, *(0061h) ;0061h存储除数 RSBX SXM ;无符号数除法,不进行符号扩展 STM #0060h, AR1 ;地址指针指向被除数 LD *AR1+, A ;被除数1000(3E8h)→A RPT # ;下条指令重复执行16次 SUBC *AR1 , A ;进行条件减法 MAR *AR1+ ; AR1+1指向商单元,因不能在前行调整AR1 STL A, *AR1 ;将商装入0062h单元 LOOP: NOP B LOOP
81
3.3.2 算术运算指令(共42条) 2. 特殊运算指令(共15条) 特殊运算指令 操作 字数 周期数 ABS src [,dst ]
dst = |src | 1 ABDST Xmem , Ymem B = B + |A(32-16)|, A = (Xmem-Ymem)<<16 1 SQDST Xmem ,Ymem B = B + A(32-16)*A(32-16) A = (Xmem -Ymem)<<16 1 CMPL src [,dst ] dst = src 1 DELAY Smem (Smem)→Smem +1 1 FIRS Xmem ,Ymem ,Pmad B = B +A(32–6)*(Pmad), A = (Xmem +Ymem)<<16 2 3 LMS Xmem ,Ymem B = B + Xmem *Ymem, A = (A +Xmem<<16)+215 1
82
3.3.2 算术运算指令(共42条) 2. 特殊运算指令(共15条)(续) 特殊运算指令 功 能 字数 周期数 MAX dst
2. 特殊运算指令(共15条)(续) 特殊运算指令 功 能 字数 周期数 MAX dst dst = max(A,B) 1 MIN dst dst = min(A,B) NEG src [,dst ] dst = -src 1 EXP src T = 冗余符号位数(src)-8 1 NORM src [,dst ] dst = src<<TS, dst = norm (src ,TS) 1 POLY Smem B = Smem<<16,(Smem系数,T未知数) A = rnd(A (32–16)*T + B ) 1 spru172c :2–6. Application-Specific Instructions RND src [,dst ] dst = src +215 1 SAT src Saturate(src) 1
83
3. 双字(32位)算术运算指令(共6条) 双字指令 操作 字 数 C16 = 0 C16 = 1 DADD Lmem, src
3. 双字(32位)算术运算指令(共6条) 双字指令 操作 字 数 周 期 C16 = 0 C16 = 1 DADD Lmem, src [ , dst ] dst = Lmem + src dst(39~16) = Lmem(31~16)+src(31~16) dst(15~0) = Lmem(15~0) + src(15~0) 1 DSUB Lmem, src src = src – Lmem src (39~16) = src(31~16) – mem(31~16) src (15~0) = src(15~0) – mem(15~0) 1 DRSUB Lmem, src src = Lmem– src src(39~16) = Lmem(31~16) –src(31~16) src(15~0) = Lmem(15~0) –src(15~0) 1
84
3.3.2 算术运算指令(共42条) 3. 双字(32位)算术运算指令(共6条)(续) 双字指令 操作 字 数 C16 = 0
3. 双字(32位)算术运算指令(共6条)(续) 双字指令 操作 字 数 周 期 C16 = 0 C16 = 1 DSUBT Lmem, dst dst = Lmem– (T << 16 + T) dst(39~16) = Lmem(31~16) – T dst(15~0) = Lmem(15~0) – T 1 DSADT Lmem, dst dst = Lmem– (T << 16 + T) dst(39~16) = Lmem(31~16) –T dst(15~0)= Lmem(15~0) + T 1 DADST Lmem, dst dst=Lmem+ (T << 16 +T) dst(39~16) = Lmem(31~16) + T dst(15~0) = Lmem(15~0) – T 1
85
4. 乘累加和乘累减指令(共9条) 指令 操作 MAC Smem, src src = src + T * Smem 1
4. 乘累加和乘累减指令(共9条) 指令 操作 字数 周期数 MAC Smem, src src = src + T * Smem 1 MACR Smem, src src = rnd(src + T * Smem) MAC #lk, src [ , dst ] dst = src + T * #lk 2 MAC Smem, #lk, src [, dst] dst = src + Smem * #lk, T = Smem 2 MAC Xmem, Ymem, src [ , dst ] dst = src + Xmem * Ymem, T = Xmem 1 MACR Xmem, Ymem, src dst=rnd(src+Xmem*Ymem), T = Xmem SQURA幻灯片 92 Smem, src src = src + Smem * Smem, T = Smem 1 SQURS Smem, src src = src – Smem * Smem, T = Smem 1
86
4. 乘累加和乘累减指令(共9条)(续) 指令 操作 MACA Smem [ , B ] B = B + Smem * A(32~16),
4. 乘累加和乘累减指令(共9条)(续) 指令 操作 字数 周期数 MACA Smem [ , B ] B = B + Smem * A(32~16), T = Smem 1 MACAR Smem [ , B ] B=B+rnd( Smem*A(32~16)), T = Smem MACA T,src [ , dst ] dst = src + T * A(32~16) 1 MACAR T, src [ , dst ] dst = rnd(src + T * A(32~16)) MACD Smem, pmad, src src = src + Smem * pmad, T = Smem, (RC)≠0, (PAR)+1→PAR (Smem + 1) = Smem 2 3 MACP Smem, pmad, src src = src + Smem * pmad, T = Smem, (RC)≠0, (PAR)+1→PAR 2 3 MACSU Xmem,Ymem,src src=src+uns(Xmem)*Ymem T = Xmem 1
87
4. 乘累加和乘累减指令(共9条)(续) 指令 操作 MAS Smem, src src = src – T * Smem 1
字数 周期数 MAS Smem, src src = src – T * Smem 1 MASR Smem, src src = rnd(src – T * Smem) MAS Xmem, Ymem, src [ , dst ] dst = src – Xmem * Ymem, T = Xmem 1 MASR Xmem, Ymem, src dst =rnd(src–Xmem*Ymem) T = Xmem MASA Smem [ , B ] B = B – Smem * A(32~16), T = Smem 1 MASA T, src [ , dst ] dst = src – T * A(32~16) 1 MASAR T, src [ , dst ] dst =rnd(src–T*A(32~16))
88
指令MACD Smem, pmad, src 的操作框图
3.3.2 算术运算指令(共42条) 4. 乘累加和乘累减指令(共9条)(续) 对常用的乘累加指令的分析: MAC[R] MACA[R] MACP和MACD MACSU Xmem, Ymem, src 指令MACD Smem, pmad, src 的操作框图 如下图所示 :
89
[(Smem)×(PAR)]×2+(src)→src (Smem)×(PAR) +(src)→src
4. 乘累加和乘累减指令 MACD Smem, pmad, src 的操作框图 pmad→PAR 4. 乘累加和乘累减指令 NO: FRCT=1 FRCT=0? YES [(Smem)×(PAR)]×2+(src)→src (Smem)×(PAR) +(src)→src 重复计数器(RC) ≠ 0? NO YES (PAR)+1→PAR (MACD指令功能) pmad → PAR, (Smem)×(PAR) +(src)→src, (Smem)→T, (Smem)→Smem+1, If (RC)≠0, (PAR)+1→PAR (Smem)→T, (Smem)→Smem+1 RPT #K MACD *AR3–, COEFFS, A
90
(1) FRCT=0时, 执行指令MACD *AR1+,TABLE, A的情况
例3-21 乘累加指令举例。 (1) FRCT=0时, 执行指令MACD *AR1+,TABLE, A的情况 指令执行前 0000 A T 0100 TABLE 0064 FRCT AR1 程序存储器 0100h 1234 数据存储器 0101h 指令执行后 E84 1234 A T 0101 TABLE 0064 FRCT AR1 程序存储器 0100h 数据存储器 0101h 1234h×64h=71C50h b ×2 b E A h (2)当FRCT=1时, 执行指令后,A= E 4AD4,其他相同。
91
第3章 汇编语言指令系统 3.3 C54x系列DSP的指令系统 3.3.3 逻辑运算指令(共17条) 逻辑运算指令包括:
第3章 汇编语言指令系统 3.3 C54x系列DSP的指令系统 3.3.3 逻辑运算指令(共17条) 逻辑运算指令包括: 布尔型指令(共6条) 移位指令 (共6条) 测试指令 (共5条)
92
AND #lk[,SHFT],src[,dst] dst = srclk<<SHFT 2
布尔型指令(共6条) 与指令 操作 字数 周期数 AND Smem , src src = src&Smem 1 AND #lk[,SHFT],src[,dst] dst = src&#lk<<SHFT 2 AND #lk,16,src[,dst] dst = src&#lk<<16 2 AND src[,SHIFT][,dst] dst=dst &src<<SHIFT 1 ANDM #lk, Smem Smem = Smem&#lk 2
93
dst=src | #lk<<SHFT 2
布尔型指令(共6条)(续) 或指令 操作 字数 周期数 OR Smem , src src = src | Smem 1 OR #lk[,SHFT],src[,dst] dst=src | #lk<<SHFT 2 OR #lk,16,src[,dst] dst = src | #lk<<16 OR src[,SHIFT][,dst] dst=dst |src<<SHIFT ORM #lk, Smem Smem = Smem | #lk 2
94
XOR #lk[,SHFT],src[,dst] dst = src #lk<<SHFT 2
布尔型指令(共6条)(续) 异或指令 操作 字数 周期数 XOR Smem , src src = src Smem 1 XOR #lk[,SHFT],src[,dst] dst = src #lk<<SHFT 2 XOR #lk,16,src[,dst] dst = src #lk<<16 XOR src[,SHIFT][,dst] dst=dst src<<SHIFT XORM #lk, Smem Smem = Smem #lk 2
95
dst = src << SHIFT {算术移位} SFTL src, SHIFT [, dst]
2. 移位指令(共6条) 移位指令共6条,都是单字单周期指令。 指令 操作 ROL src 带进位位C的循环左移 ROLTC src 带测试位TC的循环左移 ROR src 带进位位C的循环右移 SFTA src, SHIFT [, dst] dst = src << SHIFT {算术移位} SFTL src, SHIFT [, dst] dst = src << SHIFT {逻辑移位} SFTC src 条件移位指令 If (src)=0, 1→TC, else 若src(31)= src(30)则 src = src<<1 , 0→TC, 否则 1→TC
96
3.3 C54x系列DSP的指令系统 2. 移位指令 39 ~ 32 31 0 累加器src 保护位 C 39 ~ 32 31 0
2. 移位指令 带进位位C的循环左移ROL移位示意图如下: 39 ~ 32 累加器src 保护位 C 带进位位C的循环右移ROR移位示意图如下: 39 ~ 32 累加器src 保护位 C 保护位清零
97
3.3 C54x系列DSP的指令系统 2. 移位指令 带测试位TC的循环左移ROLTC移位示意图如下: 39 ~ 32 31 0
2. 移位指令 带测试位TC的循环左移ROLTC移位示意图如下: 39 ~ 32 累加器src 保护位 TC C 39 ~ 32 累加器src 保护位 比较ROL移位 C 保护位清零
98
逻辑移位指令SFTL src, SHIFT的操作示意图:
39 ~ 32 累加器src 保护位 0﹤SHIFT≤15时 C 39~32 累加器src 保护位 C -16≤ SHIFT<0时 C SHIFT=0时 保护位清零
99
算术移位指令SFTA src,SHIFT的操作示意图 :
3.3 C54x系列DSP的指令系统 算术移位指令SFTA src,SHIFT的操作示意图 : 39 累加器src 0﹤SHIFT≤15时 C 保护位与数据位一起移位,最高位移出到C
100
算术移位指令SFTA src,SHIFT的操作示意图 :
39 累加器src C -16≤ SHIFT<0,且SXM=0 累加器 39 Src C -16≤ SHIFT<0,且SXM=1 保护位与数据位一起移位 符号扩展
101
(1)当SXM=1时, 执行算术移位指令, 结果进行符号扩展。
例3-22 移位指令举例。SFTA A, -5, B (1)当SXM=1时, 执行算术移位指令, 结果进行符号扩展。 指令执行后 FF FF FC3B 2802 A T 1 C SXM 指令执行前 FF A B 1 C x SXM b b 0000 0 (2)当SXM=0时, 执行算术移位指令, 结果不进行符号扩展。 指令执行前 FF A B C x SXM 指令执行后 FF 07 FC3B 2802 A T C 1 SXM
102
例3-22 移位指令举例。 (3)执行逻辑移位指令的情况。 SFTL A, -5, B 指令执行前 FF 8765 0055
C 指令执行后 FF 00 043B 2802 A T C 1 b b
103
3. 测试指令 (共5条) 测试指令通常和条件转移等指令结合,实现程序转移,或用于检测数据的正、负极性,数据的位状态等。 测试指令 操作
3. 测试指令 (共5条) 测试指令通常和条件转移等指令结合,实现程序转移,或用于检测数据的正、负极性,数据的位状态等。 测试指令 操作 字数 周期数 BIT Xmem, BITC TC = Xmem(15 – BITC) 测试Xmem中指定的某位 1 BITF Smem, #lk TC= (Smem AND #lk) , 非0则1,测试Smem中指定的某些位 2 BITT Smem TC = Smem(15 – T(3~0)) 测试由T指定的位 1 CMPM Smem, #lk TC=(Smem==#lk) ,相等则1, 比较Smem与长立即数是否相等 2 CMPR CC, ARx ARx与AR0进行比较, CC成立, TC=1, 否则TC=0 1
104
3.3 C54x系列DSP的指令系统 3. 测试指令举例 例3-23 检测数据单元0060h中的数据低8位是否为全0。
3. 测试指令举例 例3-23 检测数据单元0060h中的数据低8位是否为全0。 STM #0060h, AR4 BITF *AR4, 00FFh;执行后若TC=0,说明该数据的低8位全为0 BITF Smem, #lk ; 测试Smem中指定的某些位 If ((Smem) AND #lk) = 0 Then TC=0, Else TC=1.
105
控制程序转移类指令的功能是改变程序执行的顺序,可划分为6类:
3.3 C54x系列DSP的指令系统 3.3.4 控制程序转移指令(共34条) 控制程序转移类指令的功能是改变程序执行的顺序,可划分为6类: 跳转指令 (共6条) 调用和返回指令(共11条) 中断指令 (共2条) 堆栈操作指令(共5条) 重复指令(共3条) 其它程序控制指令(共7条)
106
3.3.4 控制程序转移指令(共34条) 1. 跳转指令 (共6条)无条件转移和条件转移 跳转指 令分类 指令 操作 字数 周期数 近程无
B[D] pmad PC = pmad(15~0) 2 4/[2] BACC[D] src PC = src(15~0) 1 6/[4] 远程无 条件转移 FB[D] extpmad PC = pmad(15~0), XPC = pmad(22~16) 2 4/[2] FBACC[D] src PC = src(15~0), XPC = src(22~16) 1 6/[4] 近程条 件转移 BC[D] pmad, cond [ , cond [ , cond ] ] 若条件(cond(s))满足, 则PC = pmad(15~0) 2 5/3/ /[3] BANZ[D] pmad, Sind 若(Sind≠0) 则 PC = pmad(15~0) 2 4/2/ /[2]
107
条件转移指令的条件如表所示: 条件 指令中 的表示 说明 BIO*低 BIO BIO引脚电平为低 BIO*高 NBIO BIO引脚电平为高
C = 1 C 状态位C置位 C = 0 NC 状态位C清0 TC = 1 TC 测试位TC置位 TC = 0 NTC 测试位TC清0 (A) = 0 AEQ 累加器A等于0 (B)=0 BEQ 累加器B等于0 (A)≠0 ANEQ 累加器A不等于0 (B)≠0 BNEQ 累加器B不等于0 (A)﹥0 AGT 累加器A大于0 (B)﹥0 BGT 累加器B大于0 (A)≥0 AGEQ 累加器A大于等于0 (B)≥0 BGEQ 累加器B大于等于0 (A)﹤0 ALT 累加器A小于0 (B)﹤0 BLT 累加器B小于0 (A)≤0 ALEQ 累加器A小于等于0 (B)≤0 BLEQ 累加器B小于等于0 OVA=1 AOV 累加器A溢出 OVB=1 BOV 累加器B溢出 OVA=0 ANOV 累加器A无溢出 OCB=0 BNOV 累加器B无溢出
108
1. 跳转指令 条件组合的规律如下: 两组之间是或的关系) 第1组(累加器) A类 B类 EQ OV NEQ NOV LT LEQ GT
1. 跳转指令 条件组合的规律如下: 两组之间是或的关系) 第1组(累加器) A类 B类 EQ OV NEQ NOV LT LEQ GT GEQ 第2组(TC, C, BIO) A类 B类 C类 TC C BIO NTC NC NBIO 第1组最多可选2个条件,且必须针对同一个累加器。 第2组最多可选3个条件。每组每类中只能选择一个条件。 在一条指令中,2~3个条件是与的关系;或关系用多条指令实现。
109
例3-24 检测数据单元0060h中的数据若为负数,则转移至LP1位置。
跳转指令举例 例3-24 检测数据单元0060h中的数据若为负数,则转移至LP1位置。 实现的程序段如下: STM #0060h, AR2; 赋地址指针0060h→AR2 STM #0, T ; 0→T,令T(3~0)=0 BITT *AR2 ; 检测0060h的D15位 BC LP1, TC ; 当0060h的D15位为1 时转移至LP1 BIT Xmem, BITC TC = Xmem(15 – BITC) BIT *AR2, 15-15 BITT Smem; TC = Smem(15 – T(3~0)) 测试由T指定的位
110
例3-25 编程,将数据单元0060h~006Fh清0 跳转指令举例 实现的程序段如下: 代替? ST #0, *AR1+; 双字双周期
STM #0060h, AR1 ;赋地址指针060h→AR1 STM #15, AR2 ;赋循环次数15→AR2 LD #0, A ;A清0 LOOP1: STL A, *AR1+ ;(A)→AR1所指出的数据 单元,(AR1)+1→AR1 代替? BANZ LOOP1, *AR2- ;AR2的内容非0则循环至LOOP1, AR2的内容减1 ST #0, *AR1+; 双字双周期 BANZ[D] pmad, Sind 若(Sind≠0) 则PC=pmad(15~0)
111
跳转指令说明 无延迟转移和有延迟转移 BD h ANDM 4444h, *AR1+;执行此双字双周期指令后 PC = 1000h BACC[D] src; PC = src(15~0) 近程转移和远程转移 FB[D] extpmad;(extpmad(15–0)) → PC (extpmad(22–16)) → XPC FBACC[D] src ; PC = src(15~0), XPC = src(22~16)
112
2. 调用和返回指令 (共11条) /delayed 指令 操作 近程无条件调用 CALA[D] src
调用指令分类 指令 操作 字 数 周期数 近程无条件调用 CALA[D] src – –SP, PC + 1[3] → TOS, PC = src(15~0) 1 6/ 4 CALL[D] pmad – –SP, PC + 2[4] → TOS, PC=pmad(15~0) 2 4/2 远程无条件调用 FCALA[D] src – –SP, PC + 1[3] → TOS, – –SP, XPC → TOS , PC = src(15~0), XPC = src(22~16) 1 6/4 FCALL[D] extpmad – –SP, PC + 2[4] → TOS, – –SP, XPC → TOS , PC=pmad(15~0), XPC = pmad(22~16) 2 4/2 近程条件调用 CC[D] pmad, cond [ , cond [ , cond ]] 若(cond(s))满足, 则– –SP, PC + 2[4] → TOS, PC = pmad(15~0) 2 5/3/ /[3] true condition /false condition /delayed
113
2. 调用和返回指令 (共11条)续 操作 近程 无条件返回 RET[D] 子程序返回 PC = TOS, ++SP 1 5/[3]
返回指令分类 指令 操作 字 数 周期 近程 无条件返回 RET[D] 子程序返回 PC = TOS, ++SP 1 5/[3] RETE[D] 中断返回 PC = TOS, ++SP, INTM = 0 1 5/[3] RETF[D] 快速中断返回 PC = RTN, ++SP, INTM = 0 1 3/[1] 远程 无条件 返回 FRET[D] 子程序返回 XPC = TOS, ++ SP, PC = TOS,++SP 1 6/[4] FRETE[D] 中断返回 XPC = TOS, ++ SP, PC = TOS, ++SP, INTM = 0 1 6/[4] 近程条件返回 RC[D] cond [, cond [, cond ] ] 若(cond(s))满足, 则PC = TOS, ++SP 1 5/3/ /[3]
114
3.3 C54x系列DSP的指令系统 3. 中断指令 (共2条) 指令 操作 字数 周期数 INTR K
(SP)-1→SP, (PC) +1→TOS, PC = IPTR(15~7) + K << 2, INTM = 1,清零IFR相应位 1 3 TRAP K (SP)-1→SP, (PC) +1→TOS, PC = IPTR(15~7) + K << 2 1 3
115
3.3 C54x系列DSP的指令系统 4. 堆栈操作指令(共5条) 指令 操作 FRAME K SP = SP + K PSHD Smem
4. 堆栈操作指令(共5条) 堆栈操作指令有5条,都是单字单周期指令。 指令 操作 FRAME K SP = SP + K PSHD Smem – –SP, (Smem) → TOS POPD Smem Smem = (TOS), ++SP PSHM MMR – –SP, (MMR) → TOS POPM MMR MMR = (TOS), ++SP 累加器A, B不好用 PSHD
116
5. 其它程序控制指令(共7条) 指令 操作 IDLE K 省电模式,K=1或2或3 1 4 MAR Smem 如 MAR *ARx+
字数 周期数 IDLE K 省电模式,K=1或2或3 1 4 MAR Smem 如 MAR *ARx+ 若CMPT = 0,则更新ARx,ARP不变 若CMPT=1且ARx≠AR0, 则更新ARx, ARP = x;若CMPT = 1 且ARx = AR0, 则更新AR(ARP), ARP不变 1 NOP 空操作 1 3 RESET 软件复位 1 RSBX N, SBIT STN (SBIT) = 0,N指出ST0或 ST1, SBIT指出某位,位清0 1 SSBX N, SBIT STN (SBIT) = 1,N指出ST0或 ST1, SBIT指出某位,位置1 1 XC n, cond [, cond [, cond]] 若(cond(s))满足,则执行下 面的n条指令; n = 1或2 1
117
3.3 C54x系列DSP的指令系统 3.3.5 重复操作指令 (共3条) C54x的重复操作指令共3条 ,包括: RPTB
单条指令重复执行指令 (共2条) RPT,RPTZ 程序块重复执行指令 (共1条): RPTB
118
3.3.5 重复操作指令 (共3条) 单条指令重复执行指令(共2条) 单条指令重复执行指令 指令 操作 字数 周期数 RPT Smem
RC = Smem 1 3 RPT #K RC = #K (8-bit) RPT #lk RC = #lk(16-bit) 2 RPTZ dst, #lk RC = #lk, dst = 0 2 比较 执行块重复指令前,块重复计数器BRC 须先赋值! 程序块重复执行指令 RPTB[D] pmad 0 ≤pmad≤65 535 1→BRAF; 若D则 (PC)+4→RSA 否则(PC)+2→RSA pmad → REA 2 4/2
119
可以通过重复机制由多周期变为单周期的指令如下:
说明 周期 FIRS 对称FIR滤波 3 MACD 带延迟的乘法并将结果送累加器 3 MACP 乘并将结果送累加器 MVDK 数据空间到数据空间的数据传送 2 MVKD MVDM 数据空间到MMR的数据传送 2 MVMD MMR到数据空间的数据传送 MVDP 数据空间到程序空间的数据传送 4 MVPD 程序空间到数据空间的数据传送 3 READA 从程序空间到数据空间的数据读 5 WRITA 从数据空间到程序空间的写
120
3.3.5 重复操作指令 (共3条) 单条指令重复 例3-27 计算Y=10X1+10X2+……10X100
1) 采用RPT指令,用106个周期。 STM #X1,AR ;2周期 LD #0,A ;1周期 RPT # ;1周期 MAC *AR2+,#10,A ;(A) +((AR2))×10→A, ((AR2))→T,(AR2)+1→AR2, (1+100)周期 STL ;1周期 双字双周期
121
3.3.5 重复操作指令 (共3条) 例3-27 计算Y=10X1+10X2+……10X100
2) 采用BANZ指令,要用604( )个周期。 STM #99,AR1 ;2周期 STM #X1,AR2 ;2周期 LD #0,A ;1周期 LP:MAC *AR2+,#10,A ;2×100周期 BANZ LP,*AR1- ;4×100周期(条件真) STL ;1周期 ;2个机器周期(条件假)
122
程序块重复执行指令 程序块重复指令只有1条,其格式如下: RPTB[D] pmad;0 ≤pmad≤65 535 块重复计数器BRC
STM #215, BRC RPTB #TABLE ;卷积算法 STM #16,BK RPTZ A,#15 MAC *AR4+0%,*AR5+0%,A STH A,*AR2+ TABLE: MVDD *AR3+,*AR4+0% 块重复计数器BRC 块重复起始地址RSA 块结束地址REA 用存储器映像寄存器: block-Repeat Start Address register (RSA) End REA 执行操作: ① 1→BRAF(重复块操作标志位在ST1中); ② 若延迟则(PC)+4→RSA;否则 (PC)+ 2→RSA ; ③ pmad → REA; ④ 每执行一遍程序块BRC 减1直至为0,重复结束, BRAF清零。程序重复执行(BRC)+1次
123
3.3 C54x系列DSP的指令系统 3.3.6 并行操作指令(共8条) (13小条) 并行操作指令可分为四类:
并行存储和装载指令(1条) (2小条) 并行装载和乘法指令(2条) (4小条) 并行存储和加/减指令(2条)(2小条) 并行存储和乘法指令(3条) (5小条) 并行操作指令特点: (AR2)= B << (ASM – 16) || A = (AR4) << 16 单字单周期; 都工作在累加器高位(LD); 某些并行操作(ST)与ASM有关; 只能采用Xmem或Ymem寻址。 ST B, *AR2- || LD *AR4+, A
124
3.3.6 并行操作指令(共8条) 并行存储和装载指令(1条) (2小条) 指令 操作 字数 周期数 ST src, Ymem
|| LD Xmem, dst Ymem = src << (ASM – 16) || dst = Xmem << 16 1 ST src, Ymem || LD Xmem, T Ymem = src << (ASM – 16) || T = Xmem 1 If src is equal to dst, the value stored in Ymem is the value of src before the execution.
125
3.3.6 并行操作指令(共8条) 2. 并行装载和乘法指令(2条) (4小条) 指令 操作 字数 周期数 LD Xmem, dst
|| MAC Ymem, dst_ dst = Xmem << 16 || dst_ = dst_ + T * Ymem 1 LD Xmem, dst || MACR Ymem, dst_ dst = Xmem << 16 || dst_ = rnd(dst_ + T * Ymem) 1 LD Xmem, dst || MAS Ymem, dst_ dst = Xmem << 16 || dst_ = dst_ – T * Ymem 1 LD Xmem, dst || MASR Ymem, dst_ dst = Xmem << 16 || dst_ = rnd(dst_ – T * Ymem) 1
126
3.3.6 并行操作指令(共8条) 3. 并行存储和加/减指令(2条) 指令 操作 字数 周期数 ST src, Ymem
3. 并行存储和加/减指令(2条) 指令 操作 字数 周期数 ST src, Ymem ||ADD Xmem, dst Ymem= src<< (ASM–16) || dst = dst_ +Xmem<<16 1 ST src, Ymem ||SUB Xmem, dst Ymem= src <<(ASM–16) || dst = dst_ ﹣(Xmem<<16) 1
127
3.3.6 并行操作指令(共8条) 4. 并行存储和乘法指令 (3条) (5小条) 指令 操作 字数 周期数 ST src, Ymem
4. 并行存储和乘法指令 (3条) (5小条) 指令 操作 字数 周期数 ST src, Ymem || MAC Xmem, dst Ymem = src << (ASM – 16) || dst = dst + T * Xmem 1 || MACR Xmem, dst || dst = rnd(dst + T * Xmem ST src, Ymem || MAS Xmem, dst Ymem = src << (ASM – 16) || dst = dst – T * Xmem 1 || MASR Xmem, dst || dst = rnd(dst – T * Xmem) ST src, Ymem || MPY Xmem, dst Ymem = src << (ASM – 16) || dst = T * Xmem 1
128
3.3 C54x系列DSP的指令系统 3.3.6 并行操作指令 (AR2)= B << (ASM – 16)
|| A = (AR4) << 16 例 ST B, *AR2- || LD *AR4+, A 指令执行前 指令执行后 –4的补码 B <<-20 A C B FF SXM ASM C AR FF AR 数据存储器 01FFH XXXX 0200H A FF B FF SXM ASM C AR FE AR 数据存储器 01FFH F842 0200H
129
作业 习题3.2, 3.6, 3.7,3.8, 3.11, 3.17, 3.19,3.21
Similar presentations