实验一 程序的控制与转移一、实验目的1、掌握条件算符的使用。
2、掌握循环操作指令(BNAZ )和比较操作指令(CMPR )二、实验设备计算机、ZY13DSP12BD 实验箱、5402EVM 板。
三、实验原理程序控制指令主要包括分支转移、子程序调用、子程序返回、条件操作及循环操作等。
通过传送控制到程序存储器的其他位置,转移会中断连续的指令流。
转移会影响在PC 中产生和保护的程序地址。
其中转移可以分为两种形式的,一种是有条件的,另一种是无条件的。
四、实验内容编写程序,实现计算y=∑=51i ix的值。
五、实验步骤1、用仿真机将计算机与ZY13DSP12BD 实验箱连接好,并依次打开实验箱电源、仿真机电源,然后运行CCS 软件。
2、新建一个项目:点击Project -New ,将项目命名为example2,并将项目保存在自己定义的文件夹下。
3、新建一个源文件example2.asm 。
将该文件添加到工程example2.pjt 中。
4、在工程管理器中双击example2.asm ,编写源程序: .tiltle ”example2.asm ” .mmregsSTACK .usect ”STACK ”,10H ;堆栈的设置.bss x,5 ;为变量分配6个字的存储空间 .bss y,1 .def start .datatable: .word 10,20,3,4,5 ;x1,x2,x3,x4,x5 .textStart: STM #0,SWWWSR ;插入0个等待状态 STM #STACK+10H,sp ;设置堆栈指针STM #x,AR1 ;AR1指向xRPT #4 ;下一条被重复执行5遍MVPD table,*AR1+ ;把程序存储器中的数据传送到数据存储器 LD #0,A ;A 清零CALL SUM ;调用求和函数 end: B endSUM: STM #x,AR3 ;AR3指向x STM #4,AR2 ;AR2=4loop: ADD *AR3+,A ;*AR3+A-->A,然后AR3+BANZ loop,*AR2- ;如果AR2的值不为0,则跳到loop 处;否则执行下一条指令 STL A,*(y) ;把A 的低16位赋给变量yRET.end6、编写链接配置文件:/*example2.cmd */vectors.obj /*中断向量的目标文件*/example2.obj /*产生目标文件*/-o example2.out /*产生可执行下载文件,文件名可以根据不同项目而定*/-m example2.map /*产生存储器映射文件,文件名可以根据不同项目而定*/-estart /*程序入口*/MEMORY{PAGE 0: /*定义程序存贮区*/EPROM:org=0090H len=0F70H /*定义EPROM区,起始地址0090H,长度0F70H*/ VECS: org=0080H len=0010H /*定义VECS区,起始地址0080H,长度0010H*/PAGE 1: /*定义数据存贮区*/SPRAM:org=1000H len=1000H /*定义SPRAM区,起始地址1000H,长度1000H*/ DARAM:org=2000H len=2000H /*定义DARAM区,起始地址2000H,长度2000H*/}SECTIONS{.text :>EPROM PAGE 0 /*将.text段映射到PAGE0的EPROM区*/.data :>EPROM PAGE 0 /*将.text段映射到PAGE0的EPROM区*/.bss :>SPRAM PAGE 1 /*将.text段映射到PAGE1的SPRAM区*/STACK :>DARAM PAGE 1 /*将.text段映射到PAGE1的DARAM区*/.vectors :>VECS PAGE 0 /*将中断向量表定位到PAGE0的VECS区*/}7、编写中断向量表文件/* vectors.asm */.title "vectors.asm" /*中断向量表的文件名*/.ref start /*引用外部定义的标号*/.sect ".vectors" /*定义初始化的段名*/B start /*引用start*/.end8、对项目进行编译和链接:把example2.asm、vectors.asm、example2.cmd依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build选项对该项目进行链接,生成*.OUT文件。
9、装载可执行文件:点击:File-Load Programe再选择生成的example2.out文件就可以将程序装载到DSP的内部存储器中。
M10、运行程序并查看结果:首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x1000。
下面是运行结果:实验二 加减法和乘除法运算一、实验目的掌握加减法和乘除法运算指令。
二、实验设备计算机、ZY13DSP12BD 实验箱、5402EVM 板。
三、实验原理加减法是通过指令ADD 和SUB 来实现的。
乘法是通过MPY 和MAC 来实现的。
而在C54X 指令中没有除法器硬件,也就没有专门的除法指令,但是可以一条条件减法指令加上重复指令“#RPT #15”就可以实现两个无符号数的除法运算。
四、实验内容1、编写程序,分别实现计算z=x+y-w 、y=mx+b 、y=x1×a2+x2×a2、y=∑=41i ii xa 。
2、分别编写程序,实现计算0.4÷(-0.8)和16384÷512的值。
五、实验步骤1、用仿真机将计算机与ZY13DSP12BD 实验箱连接好,并依次打开实验箱电源、仿真机电源,然后运行CCS 软件。
2、新建一个项目,将项目命名为example4。
3、新建一个源文件保存在和项目相同的一个文件夹下面(example4),保存类型选择*.ASM ,保存名字命名为example4.asm 。
4、在项目中添加源文件:将刚才建立的example4.asm 文件添加到该项目中去。
5、编写源程序:在工程管理器中双击example4.asm ,将出现文本编辑窗口,在该文本编辑窗口中输入计算z=x+y-w 的代码如下: .title "example4.asm" .mmregsSTACK .usect "STACK",10H ;堆栈的设置 .bss x,1 ;为变量分配4个字的存储空间 .bss y,1 .bss w,1 .bss z,1 .def start .datatable .word 10,26,23 ;x,y,w .textstart: STM #0,SWWSR ;插入0个等待状态 STM #STACK+10H,SP ;设置堆栈指针 STM #x,AR1 ; AR1指向x RPT #2MVPD table,*AR1+ ;把程序存储器中的数据移动到数据存储器 CALL SUMB end: B endSUMB: LD *(x),AADD *(y),ASUB *(w),ASTL A,*(z)RET.end6、编写链接配置文件:参照实验一,需要更改的地方如下:更改前更改后example2.obj example4.obj-o example2.out -o example4.out-m example2.map -m example4.map7、编写中断向量表文件参照实验一,可不作修改。
8、对项目进行编译和链接:把example4.asm、vectors.asm、example4.cmd 依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。
9、装载可执行文件:要让程序代码在DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点击:File -Load Programe 再选择生成的example4.out 文件就可以将程序装载到DSP 的内部存储器中。
10、运行程序并查看结果:a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options” 对话框,把欲查看的地址改为0x1000,如右图所示。
b)点击OK 按钮,然后点击Debug-Run 让程序在DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与下图一致。
11、实验结果截图:12、建立其它项目工程文件建立项目工程文件example5,使之实现计算y=mx+b ;建立项目工程文件example6,使 之实现计算y=x1×a2+x2×a2;建立项目工程文件example8,使之实现计算y=∑=41i ii xa ,实验步骤基本同上。
实验代码及结果如下: 计算y=mx+b :.title "example5.asm" .mmregsSTACK .usect "STACK",10H ;堆栈的设置 .bss m,1 ;为变量分配4个字的存储空间 .bss x,1 .bss b,1 .bss y,1 .def start .datatable: .word 3,15,20 ;m,x,b .textstart:STM #0,SWWSR ;插入0个等待状态 STM #STACK+10H,SP ;设置堆栈指针 STM #m,AR1 ;AR1指向mRPT #2 ;把下一条指令重复执行3遍MVPD table,*AR1+ ;把程序存储器中的数据转移到数据存储器 CALL SU end: B end SULD *(m),T MPY *(x),A ADD *(b),A STL A,*(y) RET .end连接表如下更改。
更改前 更改后 example2.obj example5.obj -o example2.out -o example5.out -m example2.map -m example5.map 向量表可以不做更改。
实验结果:计算 y=x1*a1+x2*a2代码:.title "example6.asm".mmregsSTACK .usect "STACK",10H ;堆栈的设置.bss x1,1 ;为变量分配5个字的存储空间.bss x2,1.bss a1,1.bss a2,1.bss y,1.def start.datatable: .word 3,5,15,20 ;x1,x2,a1,a2.textstart: STM #0,SWWSR ;插入0个等待状态STM #STACK+10H,SP ;设置堆栈指针STM #x1,AR1 ;AR1指向x1RPT #3 ;移动4个数据MVPD table,*AR1+ ;把数据从数据存储器存入程序存储器CALL SUMend: B endSUM: LD *(x1),TMPY *(a1),BLD *(x2),TMAC *(a2),B STL B,*(y) STH B,*(y+1) RET.end连接表如下更改。