DSP汇编编程入门
- 格式:pdf
- 大小:61.27 KB
- 文档页数:6
实验二 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\目录。
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片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。
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汇编指令及其使用方法。
通用指令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并跳转到目标地址。
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中)。