DSP汇编编程入门

合集下载

轻松学会DSP——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汇编语言编程基础

实验二 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的汇编指令..

第五章 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的汇编指令..

第五章 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汇编编程及应用举例

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汇编语言初步资料

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常用汇编语言指令简介
z Example4:SETC C;置进位C=1,也可以设置 以下的控制位为1或者为0,例如:CNF、INTM、 OVM、SXM、TC和XF。类似的指令还有: CLRC。
南航自动化学院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汇编语言程序开发

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.宏定义和宏调用
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ***************************
相关文档
最新文档