电子信息学院DSP结构原理及应用实验组员:实验报告书写:日期:地点:基础教学楼B座520实验室实验一CCS的用法一、实验目的:1)了解TMS320C54X汇编语言程序对的基本格式以及汇编、链接的基本过程。2)初步熟悉CCS的用法。实验条件:1)硬件DSK板及软件开发平台工具CCS。2)源程序清单lab1.asm,链接命令文件lab1,cmd.二、实验步骤:1、打开桌面CCS2(‘5000)图标,启动CCS集成开发环境。2、创建一个新工程;从project中选择new项,输入工程名如lab1,单击完成。3、将文件添加到工程中:a、从project中选择AddFilestoproject,在弹出的对话框选择lab1.asm文件并单击打开;或在工程lab.pjt处单击右键,选择菜单命令AddFilestoproject。b、同理将lab1.cmd文件添加入工程。4、对工程进行汇编、编译、链接:执行菜单命令project-RebuildAll,或在工具栏上单击RebuildAll图标。5、加载程序:执行菜单命令File-LoadProgram,在弹出的对话框中选择lab1.out并单击打开按钮。6、运行程序:选择Debug中的Run运行程序或单击工具栏的Run图标、SingleStep图标运行程序。三实验要求:1、了解CCS菜单命令及产生各个显示窗口的操作。2、操作各种仿真命令·进入、退出CCS;·选择当前窗口,改变窗口的大小。·加载程序。·运行程序(包括单步运行)。·检查修改CUP寄存器。·检查修改存储器单元内容。·用观察窗口检查变量、CPU寄存器或存储单元内容。四、实验源程序:*lab1.asmy=a1*x1+a2*x2+a3*x3+a4*x4*************************************************.titlelab1.asm;汇编语言源文件取名.mmregs;定义存储器印象寄存器STACK.usectSTACK,10h;为堆栈分配10个空间.bssx,4;为变量x分配4个存储单元.bssa,4;为系数a分配4个存储单元.bssy,1;为变量y分配1个存储单元.defstart.data;定义数据代码段table:.word1,2,3,4;为table开始的8个存储单元赋值.word8,6,4,2.text;定义文本代码段start:STM#0,SWWSRSTM#STACK+10h,SP;设置堆栈指针STM#table,AR1;AR1指向table首地址STM#x,AR2;AR2指向x首地址STM#7,AR0;寄存器AR0赋值7LD#0,A;累加器清零loop:LD*AR1+,A;将AR1的值赋给累加器A中STLA,*AR2+;将A的低16位存储到AR2中BANZloop,*AR0-;辅助寄存器CALLSUM;调用乘法累加子程序SUMend:Bend;循环等等SUM:STM#a,AR3;将系数的首地址赋给AR3STM#x,AR4;将变量x的首地址赋给AR4RPTZA,#3;将累加器清零,重复执行下条指令4次MAC*AR3+,*AR4+,A;执行乘法累加运算,结果存储在累加器A中STLA,@y;将结果(A的低16位)送往变量y存储单元RET.end五、实验体会:1)、出现一个warning:entrypointotherthan_c_int00specified,将start用_c_int00代替后warning消失,说明标号_c_int00更精确。2)、堆栈赋值改为20时,SP值变为100,但对整体无影响,仅只是为堆栈分配的存储单元增加了。3)、4次loop循环中,PC指针由F00B到F00D依次变化,说明LD*AR1+,A;STLA,*AR2+;BANZloop,*AR0-;三条语句的执行周期均为1.实验二数据寻址方式一、实验目的1、熟悉TMS320C54X的各种寻址方式。2、继续练习CCS软件用法。二、实验条件本实验已准备的程序于表2.1中表2.1数据寻址方式实验程序二、实验步骤1、双击桌面上的“CCS”图标,启动”CCS”开发环境。2、在file菜单中选择open项,打开并阅读每一种寻址方式的源程序和链接命令文件。3、创建新工程并添加文件,包括(.asm源文件和.cmd链接命令文件)。4、汇编、编译、链接生成输出文件并加载程序。5、用单步方式执行程序,观察程序中各条指令执行结果。6、在程序中添加若干条类似这样的寻址方式的指令,并汇编、编译、链接、执行。三、实验源程序1立即寻址Lab2a.asmLab2a.cmd;********************************;ImmediateAddressing;********************************.titlelab2a.asm.defstart.textstart:LD#100,A;长立即数100加到累加器A,变为A=0x0064LD#10h,4,A;十六进制数10h左移4位后加载到累加器A,A=0x0100RSBXSXM;状态寄存器复位LD#32769,B;立即数32769转为16进制加载到B,B=0x8001LD#4000h,16,B;十六进制数4000h左移16位后加载到B,B=0x40000000hereBhere.end_____________________________________________________________________2绝对寻址Lab2b.asmLab2b.cmd;********************************;AbsoluteAddressing;********************************序号实验内容源程序名链接文件名1立即寻址Lab2a.asmLab2a.cmd2绝对寻址Lab2b.asmLab2b.cmd3累加器寻址Lab2c.asmLab2c.cmd4直接寻址Lab2d.asmLab2d.cmd5间接寻址Lab2e.asmLab2e.cmd6存储器映象寻址Lab2f.asmLab2f.cmd7堆栈寻址Lab2g.asmLab2g.cmd.titlelab2b.asm.defstartSAMPLE.set0060h.bssx,10.datatable:.word1.word2.word3.word4.word5.textstart:LD#4AB8h,A;4AB8h加载到累加器A,A=4AB8;STLA,SAMPLESTM#0060h,AR2;寄存器AR2指向首地址0x0060RPT#4;重复运行4次MVPDtable,*AR2+;将程序存储器标号为table地址单元中数据传送到寄存器AR2中,AR2变为0x0065RPT#4MVKD#0061h,*AR2+;将地址为0061h的数据存储器中的数据传到AR2,AR2变为0x006ALDx,B;B=0x0001LD0061h,A;A=0x0002hereBhere.end___________________________________________________________________3累加器寻址Lab2c.asmLab2c.cmd;********************************;AccumulatorAddressing;********************************.titlelab2c.asmSTACK.usectSTACK,10h.defstart.bssx,10.datatable:.word1234h,5678h,9abch,0def0h.textstart:STM#STACK+10h,SP;SP=90LD#table,A;A=0xE010hSTM#0060h,AR2;AR2指向首地址0x0060hRPT#3;重复运行三次READA*AR2+;立即数寻址:AR2指向的地址空间存入“word”LD#ADD_1,A;A=0xE00DhCALAA;调用子程序ADD_1hereBhereADD_1:ADD#1,A;A=0xE00EhRET.end4直接寻址Lab2d.asmLab2d.cmd;********************************;DirectAddressing;********************************.titlelab2d.asm.defstart.bssx,1.bssy,1.textstart:ST#0001,*(0180h);将数据0x0001存到地址为0x0180h的空间ST#1000,*(01ffh);将数据1000b存到地址为0x01ffh的空间ST#500,*(0200h);将数据500b存到地址为0x0200h的空间LD#3,DPLD@x,A;A=0x03E8;LD#4,DPADD@y,A;A=0x03E9hereBhere.end结果可发现,程序执行没有达到预期的结果(A=x+y=1500h)其原因是x和y存放在不同页面,执行“ADD@y,A”指令时,DP=3,结果变成0180h单元中的数(0x0001)加至累加器A,故而结果为:A=0x03E9.5间接寻址Lab2e.asmLab2e.cmd;****************************************;IndirectAddressing;****************************************.titlelab2d.asm.defstart.bssx,10hstart:ST#1000h,*(0060h);将数据0x1000存到地址为0x0060h的空间ST#2000h,*(0061h);将数据0x2000存到地址为0x0061h的空间ST#3000h,*(0062h);将数据0x3000存到地址为0x0062h的空间ST#4000h,*(0063h);将数据0x4000存到地址为0x0063h的空间LD#1000h,A;A=0x1000hSTM#0060h,AR1;AR1首地址为0x0060hMAR*AR1+;修改AR1地址,使AR1指向0x0061h,间接寻址STM#2,AR0;AR0所在首地址存放2个地址跳变LD*AR1+0,A;A=0x2000hLD*AR1,B;B=0x4000hhereBhere.end6存储器映象寻址Lab2f.asmLab2f.cmd;****************************************;Memory-MappedRegisterAddressing;****************************************.titlelab2f.asm.defstart.mmregs.textstart:STM#1234h,AR1STM#5678h,AR2STM#2,SWWSRLDMAR1,A;A=0x1234hMVMMAR1,AR3;AR3指向0x1234h,存储器印象寻址STLMA,AR2;AR2指向0x1234hhereBhere.end7堆栈寻址Lab2g.asmLab2g.cmd;********************************;StackAddressing;********************************.titlelab2g.asm.defstartSTACK:.usectSTACK,10h.bssx,10h.textstart:STM#STACK+10h,SPx的首地址为0x0060hST#1234h,*(x)0x0060h存入1234hST#5678h,*(x+1)0x0061h存入5678hST#9abch,*(x+2)0x0061h存入9abchSTM#x,AR1RPT#2PSHD*AR1+;压栈,AR1指向0x0063h,SP=8D;********************************