1.33k likes | 1.58k Views
第 3 章 汇编语言指令系统. 在 DSP 应用中,虽然可以使用 C/C++ 高级语言编程,降低了对编程者的要求,但在一些实时性要求高的场合仍然需要采用汇编编程,以充分利用 DSP 丰富的硬件资源,发挥它的实时运算能力。 用汇编语言编程,要求编程者对 DSP 的低层有充分的了解,包括硬件结构、存储器空间模型和 I/O 口的组织等。同时又要求编程者对指令系统有深刻的了解。. 第 3 章 汇编语言指令系统. 目录: 3.1 C54x 汇编语言指令集介绍 3.2 寻址方式 3.3 C54x 系列 DSP 的指令系统.
E N D
第3章 汇编语言指令系统 在DSP应用中,虽然可以使用C/C++高级语言编程,降低了对编程者的要求,但在一些实时性要求高的场合仍然需要采用汇编编程,以充分利用DSP丰富的硬件资源,发挥它的实时运算能力。 用汇编语言编程,要求编程者对DSP的低层有充分的了解,包括硬件结构、存储器空间模型和I/O口的组织等。同时又要求编程者对指令系统有深刻的了解。
第3章 汇编语言指令系统 目录:3.1 C54x汇编语言指令集介绍3.2 寻址方式3.3 C54x系列DSP的指令系统 参考:TMS320C54x DSP Reference Set Volume 2 Mnemonic Instruction Set.pdf, spru172c, 2001, TI官网
第3章 汇编语言指令系统 C54x 指令集包括: 本章介绍C54x DSP的汇编语言指令系统。与其它CPU的指令集相同,汇编语言指令又称为硬指令,它们在汇编和连接后形成可执行的机器码,供DSP进行运算和其它操作。 汇编语言指令 汇编伪指令 宏指令 3.1 C54x汇编语言指令集介绍
第3章 汇编语言指令系统 指令系统中采用的符号和缩写如下列表中所示 BIT Xmem, BITC 3.1.1 指令系统中的符号、缩写及操作符
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 XC n, cond [, cond [, cond] ] RSBX N, SBIT 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 RSBX N, SBIT 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符(续) CMPS指令
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符(续)
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符 • 指令系统中的运算符号及优先级如下列表中所示
第3章 汇编语言指令系统 3.1.1 指令系统中的符号、缩写及操作符 • 指令系统中的运算符号及优先级如下列表中所示
第3章 汇编语言指令系统 本节以LD装载指令为例,说明指令的格式和其它一些有用信息。 汇编语法 操作数 指令代码 执行 状态位 说明 指令字长 周期数 3.1.2 汇编语言指令举例 (1)LD Smem, dst (2)LD Xmem, SHFT, dst (3)LD #lk [, SHFT ], dst
第3章 汇编语言指令系统 3.2 寻址方式 C54x的寻址方式共有下列7种: • (1)立即寻址 • (2)绝对寻址 • (3)累加器寻址 • (4)直接寻址 • (5)间接寻址 • (6)存储器映像寄存器寻址 • (7)堆栈寻址
第3章 汇编语言指令系统 3.2.1 立即寻址 立即寻址是指指令中的操作数是一个立即数,用#表示 l短立即数—3位(k3)、5位(k5) 、8位(K)或9位(k9) l长立即数—16(lk)位 使用短立即数的指令代码通常为一个字长 使用长立即数的指令代码通常为两个字长 例3-3 LD #4, DP ;4→DP 指令代码:EA04H LD #7850H,A ;7850H→A; 指令代码:F020H 7850H
第3章 汇编语言指令系统 3.2.1 立即寻址 可使用立即寻址的指令及立即数的位数如下表所示: FRAME: Stack Pointer Immediate Offset; Syntax: FRAME K
第3章 汇编语言指令系统 第3章 汇编语言指令系统 3.2.2 绝对寻址 绝对寻址有下列4种类型 : • 数据存储器(dmad)寻址 • 程序存储器(pmad)寻址 • I/O端口(PA)寻址 • *(lk)寻址
3.2.2 绝对寻址 相关指令如下表所示: pmad→PAR, While (RC)≠0, (B)+(A(32–16))×(Pmem addressed by PAR)→B, ((Xmem)+(Ymem))<<16→A, (PAR)+1→PAR, (RC) −1→RC pmad→PAR, (Smem)×(Pmem addressed by PAR) +(src)→src, (Smem)→T, (Smem)→Smem+1, If (RC)≠0, (PAR)+1→PAR,
第3章 汇编语言指令系统 3.2.2 绝对寻址
第3章 汇编语言指令系统 3.2.3 累加器寻址 有两条指令采用这种寻址方式: A→PAR , (Smem)(Pmem addressed by PAR), If (RC)≠0, (RC)–1→RC , (PAR)+1→PAR
第3章 汇编语言指令系统 例3-7 程序存储器中有一个常数表格,首地址为TABLE, 长度是10个字。要求把该表格读入首地址为BUFFER的数据存储器区中。实现该功能的程序段如下: LD #TABLE,A ;#TABLE→A STM #BUFFER,AR3 ;#BUFFER→AR3 RPT #9 ;后面一条指令将运行10次 READA *AR3+ ; ((A))→(AR3),(A)+1→A,(AR3)+1→AR3 3.2.3 累加器寻址
第3章 汇编语言指令系统 3.2.4 直接寻址 直接寻址是指利用指令中的地址偏移量dma与数据页指针DP或堆栈指针SP组合,找到数据空间中的一个16位地址的方式。 指令代码格式如下所示:
第3章 汇编语言指令系统 3.2.4 直接寻址 • CPL=0时 高9位 低7位
第3章 汇编语言指令系统 16位SP+dmad dmad 16位堆栈指针SP 堆栈指针SP 3.2.4 直接寻址 • CPL=1时 SP+dmad 16位数据 存储器地址 低7位
16位数据 存储器地址 @60h DP 0000 00011110 0000 0 1 E 0 h 第3章 汇编语言指令系统 • 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 @常省略。
间接寻址是指通过两个辅助算术逻辑单元ARAU0、ARAU1及8个辅助寄存器AR0~AR7,间接获得数据存储器地址的方式。间接寻址是指通过两个辅助算术逻辑单元ARAU0、ARAU1及8个辅助寄存器AR0~AR7,间接获得数据存储器地址的方式。 单操作数寻址 LD *AR1, A 3.2.5 间接寻址 • 双操作数寻址 MAC *AR5+, *AR6+,A, B
3.2.5 间接寻址 • 单操作数寻址 地址存放情况及地址调整功能共16种:
3.2.5 间接寻址 • 单操作数寻址
3.2.5 间接寻址 $不用于MMR • 单操作数寻址
3.2.5 间接寻址 • 单操作数寻址: 单操作数寻址结构图如下所示.
第3章 汇编语言指令系统 3.2.5 间接寻址 • 位反向寻址 位反向寻址是专门为快速傅立叶变换FFT而设计的。
第3章 汇编语言指令系统 3.2.5 间接寻址 • 位反向寻址:4位二进制数的原始地址与位反向地址的对应关系如下表所示:
第3章 汇编语言指令系统 3.2.5 间接寻址 • 位反向寻址
第3章 汇编语言指令系统 循环寻址 • 在循环寻址中,有下列几个关键的参量: • 循环缓冲区的长度R:在编程中,用户应将R值赋给循环缓冲区长度寄存器BK。 • 循环缓冲区的基地址EFB (EFfective Base Address):该值必须从N位地址的边界开始,其中,N是满足2N﹥R的最小整数,即循环缓冲区的基地址EFB的低位必须有N个0,其余的高位由用户指定。通常用ARx作地址指针,在初始化中将EFB赋给ARx作初始指针。end of buffer address (EOB) 由BK内容决定。 • 调整步长step:step是每做一次运算循环缓冲区地址的变化情况,也就是加至ARx或从ARx中减去的值。 • 相对位置index:index是被访问元素在循环缓冲区内的相对位置,也就是循环缓冲区地址每变化一次后ARx的低N位。 3.2.5 间接寻址
第3章 汇编语言指令系统 例如: 循环缓冲区长度20,因为2 5﹥20,所以N=5,取基地址EFB的低5位为5个0,设EFB=1000h。在初始化编程中将20→BK 地址指针为AR1, 1000h→AR1 假设step = +1 当index变化到19时,再做index = index + step时就会使index等于BK里的值20,因此应该进行index = index + step – BK的操作,使得index=0,也就是使AR1=1000h,又回到基地址EFB的位置,从而形成了循环寻址。 3.2.5 间接寻址 • 循环寻址 循环寻址示意图如下所示: EFB EOB
第3章 汇编语言指令系统 循环寻址的算法: If 0 偏移量+步长 <BK; 偏移量=偏移量+步长; Elseif 偏移量+步长BK; 偏移量=偏移量+步长-BK; Elseif 偏移量+步长< 0; 偏移量=偏移量+步长+BK。 3.2.5 间接寻址 • 循环寻址 算法如下:
第3章 汇编语言指令系统 3.2.5 间接寻址 ②双操作数寻址 双操作数寻址结构图如下所示:
3.2.5 间接寻址 ②双操作数寻址 双操作数寻址有4种地址存放情况和地址调整功能 :
第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 ;
第3章 汇编语言指令系统 3.2.6 存储器映像寄存器寻址 存储器映像寄存器寻址是一种直接访问存储器映像寄存器MMR的方式,可以用来修改MMR的值。 有8条指令可以使用存储器映像寄存器寻址:
第3章 汇编语言指令系统 3.2.6 存储器映像寄存器寻址 MMRx: AR0–AR7, SP MMRy: AR0–AR7, SP