DSP汇编编程入门
轻松学会DSP——DSP汇编指令
位倒序寻址的执行
设FFT长度N=16,x(0)~x(15)位于地址 (01100000)~(01101111),则AR0赋值为8 (00001000),位倒序方式读入数据情况如下(AR2初 始为01100000): RPT #15 PORTW *AR2+0B,PA
功能: 地址=AR2 , AR2=B(AR2+AR0)
循环寻址的有效地址计算
循环缓冲器的有效基地址(EFB)就是用户选定的 辅助寄存器(ARx)的低N位置 0后所得到的值。
循环缓冲器的尾地址(EOB)是通过用BK的低N位 代替ARx的低N位得到。循环缓冲器的INDEX就是 ARx的低N位,step就是加到辅助寄存器,或从辅 助寄存器中减去的值。循环寻址的算法如下:
FFT中混序就是位倒序
FFT运算时输出/输入序列中必有其一要混序。
存储单元 地址
FFT变换 结果
位码倒序
位码倒序 寻址结果
存储单元 地址
FFT变换 结果
位码倒序
位码倒序 寻址结果
0000
X(0)
0000
X(0)
1000
X(1)
0001
X(8)
0001
X(8)
1000
X(1)
1001
X(9)
1001
MVMD pmad, Smem
程序存储器地址(pmad)寻址:
FIRS Xmem, Ymem, pmad MACD Smem, pmad, src
MACP Smem, pmad, src MVPD pmad, Smem
端口地址(PA)寻址
PORTR PA, Smem
PORTW Smem, PA
*(lk)寻址适用于支持单数据存储器操作数的指令
DSP汇编语言编程基础
实验二 DSP汇编语言编程基础一、 实验目的1、了解DSP的寻址方式;2、了解DSP的汇编语言与C语言混合编程。
二、 实验器材1、安装有CCS的PC机一台;三、 实验内容1、建立一个工程;2、用汇编语言编程实现一个可被C程序调用的例程。
四、 实验步骤1、汇编语言和C语言混合编程:(1) 运行CCS,建立一个工程,取名exp2a,并保存到c:\ti\myprojects\xxx\Experiment2\目录下。
(2) 编辑如下C文件,取名exp2a.c并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
/* Assembly routine */extern int sum(int *);/* define x[] as global array */int x[2]={0x1234,0x4321};/* define result s as global variable */int s;void main(){s = sum (x); /* return sum product */}(3) 编辑如下汇编文件,取名exp2_sum.asm并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * ** exp2_sum.asm SUM subroutine* called by exp2a.c* Input: Array pointer* Output: Return sum result in T0* * * * * * * * * * * * * * * * * * * * * * * * * * * * *.global _sum_summov *AR0+,AC0 ; AC0 = x[1]add *AR0+,AC0 ; AC0 = x[1]+x[2]mov AC0,T0ret ; Return T0.end(4) 编辑如下链接命令文件,取名link.cmd并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
第五章 DSP的汇编指令..
第五章 TMS320C55x系列DSP的汇编指令
(2) 用户自定义的双指令的并行
这两条指令的并行是通过用户或C编译器定义的。两条指令 同时执行两个操作,用并行符“||”区分并行执行的两条指令。 例:
MPYM *AR1+, *CDP, AC1 ;D单元的一个MAC来完成
||XOR AR2,T1
;A单元的ALU来完成
第五章 TMS320C55x系列DSP的汇编指令
1、高速数字信号处理中常采用汇编语言编程。 2、汇编语言中的两种指令集 (1) 助记符指令集:有助于记忆的符号来表示指令。 (2) 代数指令集:类似于代数表达式,运算关系清楚明了。 注意:DSP的软件开发工具只支持单一的指令形式,不支持助记
符指令和代数指令的混合形式。 3、术语、符号和缩写见P93的表5-1 4、运算符见表5-2
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
说明: NO:不能并行执行 3:指令的长度为3字节 1:周期为1 X:在X(执行)流水线阶段处理
D – ALU:在D单元ALU执行。 执行结果:AC0=(*AR3)+CARRY+AC1 状态位: Affected by CARRY,C54CM,M40等
第五章 DSP的汇编指令..
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
▪ M40=0时,D单元按32位运算模式,因此累加器溢出、进位、符号扩
展和移位操作都以第31比特为准。
▪ M40=1时,D单元按40位运算模式,因此累加器溢出,进位,符号扩
展和移位操作都以第39比特为准。
BCLR M40 ; Clear M40
BSET M40 ; Set M40
第五章 TMS320C55x系列DSP的汇编指令
第五章 TMS320C55x系列DSP的汇编指令
一、算术运算指令 用于完成加减乘除等运算,按照功能可分成以下几类:
▪ 加法指令 ▪ 减法指令:减法,条件减法,条件加/减 ▪ 乘法指令:乘法,乘加,乘减,双乘加/减 ▪ 双16比特算术指令 ▪ 比较运算指令:比较并求极值,最大/最小值,存储单元比较,寄存器比较 ▪ 移位指令:条件移位、带符号的移位。 ▪ 寄存器修改:辅助寄存器修改、堆栈指针SP修改 ▪ 隐含的并行指令 ▪ 专用指令:绝对值、归一化、有限冲激响应滤波FIR、最小均方LMS等
✓ M40=0时: 溢出位在第31位检测
DSP汇编编程及应用举例
1.DSP汇编语言程序的编写(1)汇编语言源程序以.asm为其扩展名。
(2)汇编语言源程序的每一行都可以由4个部分组成,句法如下:[标号] [:] 助记符[操作数] [;注释]其中可用空格或TAB键隔开标号——供本程序的其他部分或其他程序调用。
标号是任选项,标号后面可以加也可以不加冒号“:”。
标号必须从第一列写起,标号最多可达到32个字符(A~Z ,a~z ,0~9 ,_ ,以及$),但第1个字符不能以数字开头。
引用标号时,标号的大小写必须一致。
标号的值就是SPC(段程序计数器)的值。
如果不用标号,则第一个字符必须为空格、分号或星号(*)。
助记符——助记符指令、汇编指令、宏指令和宏调用。
作为助记符指令,一般用大写;汇编命令和宏指令,以英文句号“.”开始,且为小写。
汇编命令可以形成常数和变量,当用它控制汇编和连接过程时,可以不占用存储空间。
指令和汇编命令都不能写在第1列。
操作数——指令中的操作数或汇编命令中定义的内容。
操作数之间必须用逗号“,”分开。
有的指令操作无操作数,如NOP、RESET。
注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行或数行。
注释是任选项。
如果注释从第1列开始,也可以用“*”表示注释。
(3)常用的汇编命令如表所示。
(4)汇编语言程序中的数据形式如表所示2.程序2.1 程序一编程目的:了解DSP的输入和输出方法程序功能:求乘积之和y=a1*x1+a2*x2+a3*x3+a4*x4.title "mpy_add.asm".mmregs ;将存储映像寄存器导入列表STACK .usect "STACK",10h ;给堆栈段分配空间.bss a,4 ;将9个字空间分配给各个变量.bss x,4.bss y,1PA0 .set 0 ;将端口PA0全部置0.def start ;定义标号start.data ;定义数据代码段table: .word 4,4,4,4.word 4,4,4,4.text ;定义文本代码段start: STM #0,SWWSR ;将等待寄存器设为0,表示不等待STM #STACK+10h,SP ;设堆栈指针STM #a,AR1 ;将AR1指向变量a的地址RPT #7 ;从程序存储空间转移7+1个值到数据储存空间MVPD table,*AR1+CALL SUM ;调用SUM子程序end: B end ;循环等待SUM: STM #a,AR3 ;将AR3指向变量a的地址STM #x,AR4 ;将AR4指向变量x的地址RPTZ A,#3 ;将A清0,并重复执行下一条指令3+1次MAC *AR3+,*AR4+,ASTL A,@y ;将寄存器A中的低16位存入y地址空间PORTW @y,PA0 ;将y地址中的值输出到输出口RET ;子程序返回.end ;程序结束等待位的设置:C54x片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。
DSP汇编语言初步资料
目的:用汇编语言编写简单程序
BIT/TI
第四讲 汇编语言初步
1
学习内容
• 汇编代码的结构 • 汇编程序的构成 • 编写简单算法:y = mx+b
BIT/TI
第四讲 汇编语言初步
2
一、汇编代码的构成
label: || [cond] instruction .unit operand ;comment
BIT/TI 第四讲 汇编语言初步 20
例程2:乘加运算汇编程序
BIT/TI
第四讲 汇编语言初步
第四讲 汇编语言初步 4
二、汇编程序的构成
程序=数据结构+算法
C程序的数据结构和算法实现
数据结构
算法
BIT/TI
第四讲 汇编语言初步
5
汇编程序-数据结构
用汇编语言声明数据结构
: : : :
BIT/TI
第四讲 汇编语言初步
6
汇编程序-算法
用汇编语言编写算法
:
:
BIT/TI 第四讲 汇编语言初步 7
功能单元(可选) 操作数: • 寄存器 • 常量 • 指针 条件寄存器
注释
标号:代码或 变量地址 x .int 10 MPY .M1 A1, A3, A7 || ADD .L1x A2, B2, A5
BIT/TI 第四讲 汇编语言初步
指令: • 助记符(mnemonic) • 伪指令(directive)
完整的汇编程序构成
m: x: b: y:
.sect “myData” .int 5 .int 10 .int 2 .int 0
BIT/TI
.sect “myCode” start: LD .D1 *A0,A1 . . . ST .D1 A7,*A6 end: B end NOP 5
DSP常用汇编语言指令简介
南航自动化学院DSP技术应用实验 室
6. I/O与存储器等指令举例
z Example1:IN 7,1000h ;(DP=6)从地址为1000H 的外部端口读入数据,盛放在地址为307h的数 据单元内。类似的指令还有:OUT。
LAR AR0, #60h
;AR0内容赋值为60h
ZAC
; 累加器ACC清零
loop: ADD *+, AR1 ;把当前工作寄存器AR0指向 的内存单元数值加到ACC,然后AR0内容加1,当前工 作寄存器指针指向AR1
BANZ loop, *-AR0 ;判断AR0是否为0,否则程序 转到loop,同时AR0的内容减1。
3. TREG(暂存单元指令),PREG(乘积单元指 令),multiply instructions (乘积指令)
4. Branch instructions (程序分支转移指令) 5. Control instructions (控制指令) 6. I/O and memory instruction(I/O和存储器指令)
室
2. 工作寄存器等指令举例
z Example1:MAR *+,AR1;把当前工作寄 存器的内容加1,然后再改变工作寄存器为 AR1。
z Example2:LAR AR4,#8123h;把AR4的 值改变为立即数。
LAR AR0,16;(DP=6)把 地址=310H的内存单元内容装入AR0。
z Example3:SAR AR0,*+;(如果当前工 作寄存器=AR1)把AR0的内容拷贝到AR1 指向的内存单元。 南航自动化学院DSP技术应用实验
DSP汇编语言程序开发
储器之间的关系
外部符号
2.COFF文件中的符号
在一个模块中定义的 定义,可在另一个模 块中引用的符号.
用于处理符号 的汇编命令
.def:在当前模块中定义,并 可在别的模块中使用的符号. .ref:在当前模块中使用,但 在别的模块中定义的符号. .global:可以是上面的随便 哪一种情况.
即.out文件
1.COFF文件中的段
COFF文件种类
COFF0 COFF1 COFF2
不同种类的区别
主题格式不相同 数据部分是相同
C54x 汇 编 器 和 C 编 译 器 建 立 的 是 COFF2 文 件.C54x能够读/写所有形式的COFF文件,缺省值下 链接器生成的是COFF2文件,用链接器-vn选项可 以选择不同形式的COFF文件.
汇编命令 助记符指令 宏命令
将源程序汇编成可重定位的目标文件.obj文件; 如果需要,可以生成一个列表文件.lst文件; 将程序代码分段,每段的目标代码都有一个SPC管理; 定义和引用全局符号,可在列表后附加交叉引用表; 对条件程序块进行汇编; 支持宏功能,允许定义宏命令.
1.运行汇编程序
汇编器是名为asm500.exe的可执行程序
. 8,6,4,2
源文件的每一行都会在列表文件 中生成一行.包括行号、段程序 ;计为这数8器个单SP元C赋的初数值值、汇编后的目
标代码、源程序语句.
000007 0002
14 000000
.text
;定义文本代码段
15 000000 7728 _c_int00 STM 0,SWWSR ;软件等待状态寄存器置0,不设等待
;结束全部程序
4.宏定义和宏调用
DSP汇编语言初步
完整的汇编程序构成
m: x: b: y:
.sect “myData” .int 5 .int 10 .int 2 .int 0
.sect “myCode” start:LD .D1 *A0,A1 . . . ST .D1 A7,*A6 end: B end NOP 5
BIT/TI 第四讲 汇编语言初步 8
汇编语言初步
目的:用汇编语言编写简单程序
BIT/TI
第四讲 汇编语言初步
1
学习内容
• 汇编代码的结构 • 汇编程序的构成 • 编写简单算法:y = mx+b
BIT/TI
第四讲 汇编语言初步
2
一、汇编代码的构成
label: || [cond] operand instruction ;comment .unit
搬移指令
搬移指令共有3类:MV, MVC, MVK:
MV指令用于在通用寄存器之间传送数据。 MVC指令用于在通用寄存器与控制寄存器之 间传送数据,此条指令只能使用.S2功能单元. MVK类指令用于把16位常数送入通用寄存器。 在C6000指令集内,只能往寄存器送16位常数, 可选择MVK 、MVKH或MVKL指令向寄存 器的高16位送数。第四讲 汇编ຫໍສະໝຸດ 言初步 4二、汇编程序的构成
程序=数据结构+算法
C程序的数据结构和算法实现
数据结构
算法
BIT/TI
第四讲 汇编语言初步
5
汇编程序-数据结构
用汇编语言声明数据结构
: : : :
BIT/TI
第四讲 汇编语言初步
6
汇编程序-算法
用汇编语言编写算法
:
:
BIT/TI 第四讲 汇编语言初步 7
DSP讲义4-汇编语言编程
表4-4 对齐段程序计数器(SPC)指令
指令格式 .align [size]
说 明 将SPC对齐由参数size指定的一个边界,参数必须 是2的指数。size的单位对于代码段为字节,对 于数据段为字,默认为128字节(代码段)或 者128字(数据段) 等于.align 2
.even
表4-5 引用其他文件的指令
初始化一个或多个文本字符串
初始化当前段的连续字节或字
.uhalf value_l[,…,value_n]
.ushort value_l[,…,value_n] .uint value_l[,…,value_n] .ulong value_l[,…,value_n] .uword value_l[,…,value_n] .word value_l[,…,value_n] .xfloat value_l[,…,value_n]
当前段或者指定段使能有条件连接
定义一个.data段 定义一个自定义段 定义一个.text段 定义一个自定义段,段长度size的单位为字
表4-3 初始化常数(数据和存储器)伪指令(1)
指令格式 .byte value_l[,…,value_n] .char value_l[,…,value_n] 说 明 当前段初始化一个或者多个连续的字节或字
源代码(PC)—编译和链接(PC)
----链接后的文件—执行(PC)
堆栈空间预置
堆栈段名 ENDS
数据段名 SEGMENT 代码段名 SEGMENT ASSUME 段寄存器指定 过程名1 PROC 类型 过程体1 过程名1 ENDP …… 过程名n PROC 类型 过程体n 过程名n ENDP 启动标号: 段寄存器装填 主程序体 程序结束指令序列 代码段名 ENDS END 启动标号
DSP汇编语言程序设计入门
CCS的使用与汇编语言程序设计入门一、实验目的1、了解DSP开发系统的组成和结构;2、熟悉DSP 集成开发环境;3、掌握TMS320C54X程序空间的分配;4、掌握TMS320C54X数据空间的分配;5、掌握操作TMS320C54X存储器的相关指令;6、掌握TMS320C54X相关运算的指令;7、TMS320C54X相关程序流程控制类的指令;8、熟悉DSP开发软件的使用;二、实验内容设计一汇编程序,实现从一组所给的数的累加,并将结果送数码管显示。
三、实验设备硬件:DSP实验与开发系统、JTAG仿真器、PC机Pentumn100以上。
软件:PC机操作系统win98或以上、CCS集成开发环境、仿真器驱动程序。
四、实验步骤1)连接好 DSP开发系统,运行CCS软件;2)用汇编语言设计一程序及相应的链接命令文件(.CMD文件):, 或输入参考程序及链接命令文件(.CMD文件)(附后),使一组所给的数累加,并将结果送数码管显示。
3)新建一个工程;4)向工程添加汇编程序及链接命令文件(.CMD文件):;5)编译、链接工程工程中的所有文件,生成out文件;6)装载上述out文件,并运行;五、程序汇编语言程序:.title "mac.asm".mmregs.def startSIZE .set 100stack .usect "STK", SIZESEGSEL .set 0001b ;数码管使能控制数据,此处第0数码管选通SEGSELPORT .set 0h ;数码管使能控制口地址SEGPORT .set 1h ;数码管数据口地址.bss SEG_DA TA,10 ;用于存放从SEG_V ALUE装载进来的数码管编码数据.bss x,5 ;用于存放从table0装载进来输入数据.bss z,1 ;用于存放输出数据(计算结果).datatable0: .word 1,2,3,4,5 ;待计算的一组输入数据;以下用于存放数码管编码数据,分别控制数码管显示0~9SEG_V ALUE .word 077h,014h,0b3h,0b6h,0d4h,0e6h,0e7h,034h,0f7h,0f6H.textstart:stm #stack+SIZE, SP;;;;;;;;;C5402 初始化;;;;;;;;;;;;;;;stm #2b40h,ST1;STM #2B40H,ST1;stm #1e00h,ST0;stm #02024h,PMST ;IPTR=0010,0000,0 ->RESET=2000Hstm #0h,SWWSRstm #04007h,CLKMD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;stm #SEG_DA TA, AR3 ;将数码管编码数据从SEG_V ALUE装入SEG_DATA rpt #9mvpd SEG_V ALUE, *AR3+stm #x,AR1 ;从空间table0装载输入数据进入空间xrpt #4mvpd table0,*AR1+call sum ;调用累加子程序ld #SEGSEL,B ;第0个数码管选通portw *(0bH), SEGSELPORTstlm A,AR0 ;累加子程序返回的计算结果转入AR0stm #SEG_DA TA,AR7 ;数码管编码数据区首地址送AR7nopmar *AR7+0 ;首地址(AR7中内容)+偏移地址(AR0中内容)nopportw *AR7,SEGPOR T ;让数码管显示计算结果end: b endsum: stm #x,AR3 ;累加子程序rptz A,#4add *AR3, Astm #z,AR4stl A,*AR4ret.end链接命令文件(.CMD文件):mac.obj-o mac.out-m mac.map-e startMEMORY{PAGE 0:EPROM :org=02000h,len=200hPAGE 1:SPRAM :org=0060h,len=001fhDARAM :org=0080h,len=100h}SECTIONS{.text :>EPROM PAGE 0.data :>EPROM PAGE 0.bss :>SPRAM P AGE 1.stack :>DARAM PAGE 1}六、实验现象与结果:运行程序后, 用CCS观察相应的存储单元(参考程序中用z), 该单元存储了所给一组数的累加值, 且与数码管显示结果一致。
DSP汇编指令总结
DSP汇编指令引言DSP是指数字信号处理器,是一种专门用于数字信号处理的微处理器。
DSP汇编指令是在DSP芯片上执行操作的命令。
这篇文档将常见的DSP汇编指令及其使用方法。
通用指令MOVMOV是Move的缩写,指将数据从一个寄存器移动到另一个寄存器或内存地址中。
它有很多不同的格式,例如:MOV R1, #0 ; 将0存储在R1寄存器中MOV R2, R1 ; 将R1寄存器中的值复制到R2寄存器中MOV @R3, R2 ; 将R2寄存器中的值存储在R3指向的内存地址中ADD和SUBADD和SUB分别表示加法和减法运算。
它们也有不同的格式,例如:ADD R1, R2 ; 将R2寄存器中的值加到R1寄存器中ADD R1, #2 ; 将2加到R1寄存器中SUB R1, R2 ; 将R2寄存器中的值从R1寄存器中减去AND和ORAND和OR分别表示按位与和按位或运算。
它们也有不同的格式,例如:AND R1, R2 ; 将R1寄存器和R2寄存器中的值按位与后存储在R1寄存器中OR R1, R2 ; 将R1寄存器和R2寄存器中的值按位或后存储在R1寄存器中CMPCMP是Compare的缩写,用于比较两个值。
它会将两个操作数相减,并设置相关的标志位。
它的格式如下:CMP R1, R2 ; 比较R1和R2寄存器中的值跳转指令JMPJMP是Jump的缩写,用于无条件跳转到目标地址。
它的格式如下:JMP label ; 跳转到标签为label的位置JNZ和JZJNZ和JZ分别表示如果结果不为零则跳转和如果结果为零则跳转。
它们的格式如下:JNZ label ; 如果前一条CMP指令比较结果不为零,则跳转到标签为label的位置JZ label ; 如果前一条CMP指令比较结果为零,则跳转到标签为label的位置JGE和JLEJGE和JLE分别表示如果大于或等于则跳转和如果小于或等于则跳转。
它们的格式如下:JGE label ; 如果前一条CMP指令比较结果大于或等于,则跳转到标签为label的位置JLE label ; 如果前一条CMP指令比较结果小于或等于,则跳转到标签为label的位置循环指令DJNZDJNZ是Decrement and Jump if Not Zero的缩写,表示如果操作数不为零则减1并跳转到目标地址。
DSP第五章 DSP的汇编指令
展和移位操作都以第31比特为准。
M40=1时,D单元按40位运算模式,因此累加器溢出,进位,符号扩
展和移位操作都以第39比特为准。
BCLR M40
; Clear M40
BSET M40
; Set M40
第五章 TMS320C55x系列DSP的汇编指令
2、累加器溢出状态(ACOVx)
当AC0~AC3寄存器溢出时,目的累加器的溢出状态位ACOV0~3被置1。 以下情况会清零ACOVx位
复位; CPU执行一个跳转,条件调用,条件返回或执行一条测试ACOVx的指令; 通过BCLR指令清除; 溢出位检测受ST1_55中的M40位影响,即:
第五章 TMS320C55x系列DSP的汇编指令
(3)内置并行指令与用户自定义并行指令的混合形式 在不引起资源冲突的情况下,将隐含并行的指令按用户自定义 方式与另一条指令并行执行。例:
MPY *AR0, *CDP, AC0 ;隐含的或内置的并行指令 :: MPY *AR1, *CDP, AC1 ||MOV #5, AR1
பைடு நூலகம்
在实际编程时,只要指令满足这三条基本规则,即可写成并行
方式,然后进行编译。如果编译有错,则可参照书上详细规则进 行检测。
第五章 TMS320C55x系列DSP的汇编指令 5.4 TMS320C55x DSP的汇编指令
TMS320C55x DSP的汇编指令按操作分为以下6类 算术运算指令 比特操作指令 一条指令的属性包括: 语法(Syntax) 执行的操作 操作数 相关的状态位 是否有并行使能位 长度(Size) 执行周期(Cycles) 在流水线(Pipeline)上的执行阶段 在哪个功能单元执行(Executed) 是否可以重复执行等
DSP-10DSP汇编语言编程基本方法2
例:执行指令: EXP A
执行前
执行后
A=FF FFFF FFCB
T=
0000
A= FF FFFF FFCB
T=
0019 (25)
上例中,由于A≠0,需要先求出A的冗余符号位并减去8。
A=F F F F F F F F C B
1111 1111 1111 1111 1111 1111 1111 1111 1100 1011
4
10.1 小数运算
如Q8格式,其位权值为: (-1)s 26 25 24 23 22 21 20.2-1 2-22-3 2-42-5 2-62-72-8
例:
0 0 0 0 0 0 1 0. 1 0 1 0 0 0 0 0
(-1)s 26 25 24 23 22 21 20.2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8
举例: x=-1.5,它的单精度格式表示为: 1 01111111 10000000000000000000000 其中,s=1,e=127,f=0.5,因此x=-1.5。
13
10.2 浮点运算
由于C54x DSP用16位表示数字,采用一个单元保存指数 和一个单元保存尾数的两个16位表示法。
浮点数与定点数的关系: 定点数 = 尾数2-指数
a1
3333
a2
8CCD
b1
0001
c1
6666
LD @c1,T
;取a1的尾数
b2
0000
MPY @c2,A EXP A ST T,@temp NORM A STH A,@mp
;求尾数的乘积
c2
;求即尾:数乘乘积积尾的数指=数c1×c2 ep
;;指完数成存尾入数t相em乘p
实验四 DSP 汇编基础
1.在CCS下新建一个项目exp2。
2.新建一个汇编文件exp2.asm,并将其添加到项目中。
;exp2.data ;初始化dataoffset .int 4data1: .int 0data2: .int 0.def start ;define标号.textstart: ;注意复习直接寻址相关知识:DP及DP所指向数据页RSBX CPL ;CPL=0, 采用DP的直接寻址LD #0,ALD #0,B ;load acc ALD #offset,DP ;用offset所在的数据页load数据页指针DP,NOPNOPloop: ;注意观察#lk、lk、和*(lk)的区别ADD offset,AADD #offset,BROL A ;左移 acc ASTL A,data1 ;保存 acc A的低字STL B,*(data2) ;保存 acc B的低字B loop输入完后,点file-save保存在exp2文件夹中(下同)。
3.新建一个中断向量表文件vectors.asm,并将其添加到项目中。
;vectors.asm;this program branches to the desired starting;location in program memory.ref start.def _c_int00 ;定义程序入口_c_int00.sect ".vectors"_c_int00 b start ;程序加载后自动跳转至start处.end4.新建一个CMD文件exp2.cmd,并将其添加至项目中。
注意cmd文件中的注释方式。
exp2.objvectors.obj-o Debug\exp2.out-m Debug\exp2.mapMEMORY{PAGE 0:/*PROGRAM*/P_DARAM47: origin=1000H, len=2000HVECT: origin=0ff80H, len=80HPAGE 1:/*DATA*/USERREGS: origin=60H, len=1cHD_DARAM03: origin=80H, len=7f00H/*尝试改变D_DARAM03的origin值为100H、180H等值,观测DP的变化情况*/D_DARAM47: origin=8000H, len=8000H}SECTIONS{.data:> D_DARAM03 PAGE 1.text:> P_DARAM47 PAGE 0.vectors:> VECT PAGE 0}5.编译项目文件,并用记事本打开并观察exp2.map(在exp2\debug中)。
BWDSP汇编入门
调试
• 进入汇编程序后,选择“register”,定制 寄存器组,本例程序中使用了“core X”、 “U address”。 • 按F11开始指令级调试。注意部分程序因流 水线执行及因数据相关被编译器自动插入 nop(未显示),导致寄存器值的变化不随 按下F11而单步变化。
}
result = asm_add (a, b, c, &d); printf ("result is %f\n", result); return 0;
纯汇编调用子函数--子函数乘法
.text .global __main __main: _main_1: [u8 += -1,0] = xr63 || xr63 = u9 [u8 += -1,0] = xr63 u9 = u8 + 0 u8 = u8 + -10 _main_2: xr0 = 100 || xfr1 = 2.5 //需要有类型转换 xr3 = __str_0_pcf__ .code_align 16 call __asm_mul [u8 + 1,0] = xr3 [u8 + 2,0] = xr8 .code_align 16 call __printf _main_3: u8 = u9 + 0 xr63 = [u8 + 1,0] u9 = xr63 || u8 = u8 + 2 .code_align 16 ret .data __str_0_pcf__: .str32z "result is %f\n" .global __main .global __asm_mul .global __printf
.text .global __asm_mul __asm_mul: _asm_mul_1: xr40 = r0 || xr41 = r1 xfr40 = float r40 xfr42 = fr40 * fr41 xr8 = r42 .code_align 16 ret .global __asm_mul
第五讲 DSP芯片的汇编语言101102
(2) 减法指令(13条) 《附录A》 说明:SUBS用于无符号数的减法运算; 说明 SUBB用于带借位的减法运算(如32位 扩展精度的减法); SUBC为条件减法 .
减法指令举例: P182
Example 3: SUBB 5, A
Example 3: SUBB 5, A
(3) 乘法指令(10条)《附录A》
? 什么区别?
(5)长操作数指令(6条)《附录A》 长操作数指令( 附录A DADD Lmem,src [,dst] ;P149
例 8: DADD *AR3–, A, B
例 8: DADD *AR3–, A, B
(6)特殊应用指令(15条)《附录A》 ( 条 • 求绝对值 • 求累加器指数 • 求累加器的最大/小值 • 归一化 • 求多项式的值 • 求两点之间距离的平方 • 求最小均方值 • 对称有限冲击响应滤波器等
例20: RPTB[D] pmad; 块循环指令。 : ; 块循环指令。 循环次数必须在指令执行前装入BRC。执行命令时, 循环次数必须在指令执行前装入 。执行命令时, 块循环起始寄存器RSA装入 装入PC+2(若有 后缀时为 若有D后缀时为 块循环起始寄存器 装入 若有 PC+4),块循环尾地址寄存器 中装入pmad。 ,块循环尾地址寄存器REA中装入 中装入 。 ST #99,BRC , ;循环计数器赋值 RPTB end_block-1 ;end_block 为循环块的底部 -
(1) 分支指令(6条)《附录A》 分支指令( 条 附录A
含义:根据条件判断改写 值 使程序发生分支转移。 含义:根据条件判断改写PC值,使程序发生分支转移。 两种形式:有条件分支转移和无条件转移。 两种形式:有条件分支转移和无条件转移。 常用指令: 常用指令: B[D]、BACC[D] ;BC[D]、BANZ[D] 、 、
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.cio: {} > SARAM
.data: {} > SARAM
.bss: {} > SARAM
.const: {} > SARAM
.gblinit: {} > SARAM
frt: {} > SARAM
.pinit: {} > SARAM
.sysinit: {} > SARAM
.far: {} > SARAM
为什么? 3、 对本次实验作出小结。
*************************** * exp2b_3: Indirect Addressing Mode ***************************
.def _exp2b_3 .text _exp2b_3 ; Indirect addressing
mpym *AR0+,*AR1+,AC0 add AC1,AC0 mpym *AR0+,*AR1+,AC1 add AC1,AC0 mpym *AR0+,*AR1+,AC1 add AC1,AC0 mpym *AR0+,*AR1+,AC1 add AC1,AC0 mpym *AR0+,*AR1+,AC1 add AC1,AC0 mpym *AR0+,*AR1+,AC1 add AC1,AC0
Ai[8]={1,2,3,4,5,6,7,8}。并保存到 c:\ti\myprojects\xxx\Experiment2\
目录。
*************************** * exp2b_1: Absolute Addressing Mode ***************************
(3) 编 辑 如 下 汇 编 文 件 , 取 名
exp2_sum.asm
并保存到
c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
***************************** * exp2_sum.asm SUM subroutine * called by exp2a.c * Input: Array pointer * Output: Return sum result in T0
实验二 DSP 汇编语言编程基础
一、 实验目的 1、了解 DSP 的寻址方式; 2、了解 DSP 的汇编语言与 C 语言混合编程。 二、 实验器材 1、安装有 CCS 的 PC 机一台; 三、 实验内容 1、建立一个工程; 2、用汇编语言编程实现一个可被 C 程序调用的例程。 四、 实验步骤 1、汇编语言和 C 语言混合编程: (1) 运 行 CCS , 建 立 一 个 工 程 , 取 名 exp2a , 并 保 存 到
c:\ti\myprojects\xxx\Experiment2\目录下。 (2) 编 辑 如 下 C 文 件 , 取 名 exp2a.c 并 保 存 到
c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
/* Assembly routine */ extern int sum(int *);
/* --------------------------------------exp2b.c Interfacing C with Assembly Langugage and using Different Addressing Modes
------------------------------------------*/ extern void exp2b_1(void); extern void exp2b_2(void); extern int exp2b_3(int *, int *); extern int exp2b_4(int *, int *); int A[8]; int Xi[8];
(7) 在 memory watch 窗口观察 Ai 和 Xi 的初始化值,在 CPU 寄存器窗口观察 点乘的计算过程。
(8) 对 exp2b_3.asm 和 exp2b_4.asm 的性能进行分析。 五、 实验报告
1、简述 C 和汇编混合编程中的参数是如何传递的。 2、若将 exp2a 中的 s 定义放入 main( )函数中,应到哪个位置观看其内容?
int result1,result2; void main() {
exp2b_1(); exp2b_2(); result1 = exp2b_3(Ai, Xi); result2 = exp2b_4(Ai, Xi); }
(2) 编辑如下汇编程序 exp2b_1.asm,采用绝对寻址对数组 Ai 进行初始化,
.dp _Xi
mov #9,@_Xi
; Direct addressing mode
mov #3,@_Xi+1
; Initialize Xi[8]={9,3,2,0,1,9,7,1}
mov #2,@_Xi+2
mov #0,@_Xi+3
mov #1,@_Xi+4
mov #9,@_Xi+5
mov #7,@_Xi+6
和 x 的内容,并记录 s 的值。 (8) 重新单步执行 C 代码和汇编代码,观察 C 编译器产生的汇编代码
exp2a.asm,注意汇编程序的返回值是如何被传递到 C 调用程序的。 2、寻址方式实验。 (1) 编 辑 如 下 C 文 件 , 取 名 为 exp2b.c , 并 保 存 到
c:\ti\myprojects\xxx\Experiment2\目录。
(3) 编辑如下汇编程序 exp2b_2.asm,采用间接寻址对数组 X 进行初始化,
Ai[8]={9,3,2,0,1,9,7,1}。并保存到 c:\ti\myprojects\xxx\Experiment2\
目录。
*************************** * exp2b_2: Direct Addressing Mode ***************************
len = 0xfe00 len = 0x30000 len = 0x100 len = 0x380000 len = 0x3e0000 len = 0x20000
SECTIONS {
.vectors: {} > VECT .cinit: {} > SARAM .text: {} > SARAM .stack: {} > SARAM .sysstack {} > SARAM .sysmem: {} > SARAM
.def _exp2b_2 .ref _Xi
.text
_exp2b_2 ; Direct addressing
btstclr #14,*(ST1),TC1 ; Turn off CPL bits for direct addressing mode
bclr C54CM
amov #_Xi,XDP
; Load direct addressing data-page pointer
.switch: {} > SARAM
.MEM$obj: {} > SARAM
.sysheap: {} > SARAM
} (5) 选择 Project-Options-Linker-Library 标签,添加实时支持库 rts55.lib。 (6) 编译并链接工程,下载 exp2a.out,并选择 Go-Main 命令。 (7) 观察并记录 CPU 寄存器窗口中 AC0、AR0、T0 的值,观察 memory 中 s
mov #1,@_Xi+7
xcc continue,TC1
bset CPL
; Turn CPL bit back on
continue
ret
.end
(4) 编辑如下汇编程序 exp2b_3.asm,采用间接寻址实现 Ai 和 X 的点乘。并
保存到 c:\ti\myprojects\xxx\Experiment2\目录。
link.cmd
并保存到
c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
-c
-stack
0x800
-sysstack 0x200
-m link.map
MEMORY { DARAM: SARAM: VECT: SDRAM: Flash: CPLD:
}
origin = 0x200, origin = 0x10000, origin = 0x100, origin = 0x80000, origin = 0x400000, origin = 0x800000,
mpym *AR0+,*AR1+,AC0 || rpt #6
macm *AR0+,*AR1+,AC0
mov AC0,T0 ret .end
(6) 在 c:\ti\myprojects\xxx\Experiment2\目录下建立工程 exp2b,将 link.cmd、 exp2b.c、exp2b_1.asm、exp2b_2.asm、exp2b_3.asm 和 exp2b_4.asm 加入工 程,编译、连接工程,并下载 exp2b.out。
/* define x[] as global array */ int x[2]={0x1234,0x4321};
/* define result s as global variable */ int s;
void main() {
s = sum (x); /* return sum product */ }
*************************** * exp2b_4: Paralle Processing ***************************