DSP基于CCS向量文件编写和汇编语言设计实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1实验三、向量文件的编写及多个文件的链接一、实验目的1.编写复位向量文件vectors.asm。2.多个文件的链接。3.编写复位和中断向量文件。4.仿真外部中断。二、实验条件lab3.asm和lab3.cmd文件三、实验步骤1.双击桌面上CCS2图标,启动CCS集成开发环境。2.建立新工程,并将lab3.asm和lab3.cmd添加入工程。3.按照3.6.4节中的例子,编写复位向量文件vectors.asm并将该文件添加入工程。4.为了将lab3和vectors两个文件相链接,对lab3.asm和lab3.cmd文件进行必要的修改。5.用菜单命令对工程的所有文件进行汇编、编译、链接生成输出文件。6.加载程序并单步执行lab3.out文件,仔细观察复位向量的作用。7.参看教材4.4节中的内容,仿真外部中断INT2:①在lab3.asm中,增加一段中断服务子程序INT_2.dat,其内2容将累加器A变负。②修改lab3.asm,开放INT2中断。③修改vectors.asm,增加INT2中断向量。④编写仿真外部中断用的数据文件,文件名为INT_2.dat,每隔100个时钟周期向CPU发出一次中断请求,直到仿真结束。⑤对工程中所有文件重新汇编、编译、链接生成新的输出文件。⑥执行前,从Tool菜单中选择,用鼠标选中要连接PinName再按connect按钮,选择输入文件INT_2与INT2引脚相连,单击打开按钮。⑦加载程序,并利用单步方式执行程序,注意观察中断向量在程序执行过程中的作用。四、实验程序*************************************************lab3.asmy=a1*x1+a2*x2+a3*x3+a4*x4*************************************************.titlelab3.asm.mmregs;定义存储器映像寄存器STACK.usectSTACK,10h;给堆栈分配16个存储单元.bssx,4;给x分配4个存储单元.bssa,4.bssy,1.defstart;定义标号start3.defINT_2.data;定义数据段.mmregstable:.word1,2,3,4;为标号table开始的.word8,6,4,2;8个存储单元赋初值.text;定义文本段start:STM#STACK+10h,SP;设置堆栈指针STM#table,AR1;AR1指向table的首地址STM#x,AR2;AR2指向x的首地址STM#7,AR0;将AR0赋7LD#40h,A;将立即数40h加载到A累加器STM#0,SWWSR;SWWSR置0,不插等待周期RSBXINTM;开放全部可屏蔽中断STM#04h,IMR;开放INT2中断loop:LD*AR1+,A;将AR1中数据加载到A累加器STLA,*AR2+;将A低16位送往AR2寄存器所指地址BANZloop,*AR0-;重复执行7次CALLSUM;调用SUM子程序end:Bend;循环等待SUM:STM#a,AR3;AR3指向a的首地址STM#x,AR4;AR4指向x的首地址RPTZA,#3;将A清零,重复执行下条指令3次4MAC*AR3+,*AR4+,A;相乘累加存入A累加器STLA,*AR2;将A的低16位送往AR2所指向的地址RET;子程序返回INT_2:NEGA;将A累加器变负RETE;开中断,从中断返回.end;程序结束五、实验现象每隔100个时钟周期来一次中断,累加器A中的数值变负六、实验体会学习了如何设置中断,及源程序和向量文件的链接,编写仿真外部中断的数据文件,更直观的认识到程序是如何执行中断的。5实验四汇编语言程序设计一、实验目的通过实验熟悉指令系统,初步掌握汇编语言程序设计的基本方法和技巧。二、实验条件在第五章基础上进行。三、实验内容1.编写实验y=∑aixi5n=i小数乘法累加的汇编语言程序lab4a.asm。其中a={0.1,0.2,0.3,0.4,0.5}。2.将第五章例9和例10组合成一个程序lab4b.asm,实现对一个数组x[5]={1000h,2000h,3000h,5000h}进行初始化,并利用块重复操作指令将该数组每个元素加一。3.将第五章中的例20或例21,分别编写成完整的除法运算程序lab4c1.asm和lab4c2.asm。4.编写实现两个64位数相加的汇编语言程序lab4d.asm。5.在设计好上述每一个汇编语言程序的同时,均应设计相应的链接命令文件lab4x.cmd,并利用CCS进行调试。四、实验程序lab4a6******************************************************lab4a.asmy=a1*x1+a2*x2+a3*x3+a4*x4+a5*x5******************************************************.titlelab4a.asm.mmregsSTACK.usectSTACK,10h;给堆栈分配16个存储单元.bssx,5;给x分配4个存储单元.bssa,5.bssy,1.defstart.datatable:.word1*32768/10,2*32768/10,3*32768/10,4*32768/10,5*32768/10;为标号table开始的10个存储单元赋初值。.word1*32768/10,2*32768/10,3*32768/10,4*32768/10,5*32768/10;分别是0.1,0.2,0.3,0.4,0.5,0.1,0.2,0.3,0.4,0.5。.text;定义文本段start:SSBXFRCT;将小数方式位状态寄存器置一STM#STACK+10h,SP;设置堆栈指针STM#table,AR1;AR1指向table的首地址STM#x,AR2;AR2指向x的首地址STM#9,AR07LD#0,Aloop:LD*AR1+,A;将AR1中数据加载到A累加器STLA,*AR2+;将A低16位送往AR2寄存器所指地址BANZloop,*AR0-;重复执行9次CALLSUM;调用SUM子程序end:Bend;循环等待SUM:STM#a,AR3;AR3指向a的首地址STM#x,AR4;AR4指向x的首地址RPTZA,#4;将A清零,重复执行下条指令4次MAC*AR3+,*AR4+,A;相乘累加存入A累加器STHA,@y;将A的高16位送往yRET;子程序返回.end;程序结束lab4b.titlelab4b.asm.mmregs;定义存储器映像寄存器.bssx,5;给x分配5个存储单元.defstart;定义标号start.data;定义数据段table.word1000h,2000h,3000h,4000h,5000h;为标号table开始的5个存储单元赋初值。.text;定义文本段8start:STM#x,AR2;AR2指向x的首地址RPT#4;重复下条指令4次MVPDtable,*AR2+;重复传递共5个数据next:LD#1,16,B;将1左移16位加载到B累加器STM#4,BRC;将块重复计数器赋值为4STM#x,AR4;AR4指向x的首地址RPTBend-1;循环执行下面语句,end-1为结束地址ADD*AR4,16,B,A;将AR4中数据左移16位加B赋给ASTHA,*AR4+;将A高16位送往AR4寄存器所指地址end:Bend;循环等待.end;程序结束lab4c1;**************;*lab4c1.ASM*;**************.titlelab4c1.asm.defstartSTACK.usectSTACK,100;给堆栈分配100个存储单元.bssnum,1.bssden,1.bssquot,1.data9table:.word-128;4*32768/10;为标号table开始的4个存储单元赋初值.word1024;-8*32768/10;分别是-128,0.4,1024,-0.8.textstart:STM#num,AR1RPT#1;重复执行下条语句1次MVPDtable,*AR1+;传送2个数据至分子、分母单元LD@den,16,A;将分母移到A累加器(31-16)MPYA@num;(num)*(A(32-16))移到B,获取商的符号ABSA;分母取绝对值STHA,@den;分母绝对值存回原处LD@num,16,A;分子移到A(32-16)ABSA;分子取绝对值RPT#14;15次减法循环,完成除法SUBC@den,A;有条件减法XC1,BLT;如果B0(商是负数),则需要变号NEGA;将A累加器变负STLA,@quot;将A的低16位送往quotdone:Bdone.end10lab4c2;**************;*lab4c2.ASM*;**************.titlelab4c2.asm.defstartSTACK.usectSTACK,100;给堆栈分配100个存储单元.bssnum,1.bssden,1.bssquot,1.datatable:.word16384;66*32768/100;为标号table开始的4个存储单元赋初值.word512;-33*32768/100;分别是16384,0.66,512,-0.33.textstart:STM#num,AR1RPT#1;重复执行下条语句1次MVPDtable,*AR1+;传送2个数据至分子、分母单元LD@den,16,A;将分母移到A累加器(31-16)MPYA@num;(num)*(A(32-16))移到B,获取商的符号11ABSA;分母取绝对值STHA,@den;分母绝对值存回原处LD@num,A;分子移到AABSA;分子取绝对值SUB@den,A;从累加器A中减去den中数据BCnext,ALT;条件分支转移,A0,则执行next子程序ADD@den,A;在累加器A中加上den中数据RPT#15;重复下条语句15次SUBC@den,A;有条件减法Bnext1;执行next1子程序next:LD@num,16,A;分子移到A(32-16)ABSA;分子取绝对值RPT#14;重复下条语句14次SUBC@den,A;有条件减法next1:XC1,BLT;如果B0(商是负数),则需要变号NEGA;将A累加器变负STLA,@quot;将A的低16位送往quotdone:Bdone.endlab4d;lab4d.asm12.titlelab4d.asm.defstarttable:.word4000h;x3.word0f000h;x2.word0f000h;x1.word0f000h;x0.word4000h;y3.word3000h;y2.word2000h;y1.word1000h;y0.bssx,4.bssy,4.bssz,4.textstart:STM#x,AR1;AR1指向x的首地址RPT#7;重复执行下条语句7次MVPDtable,*AR1+;将table中的8个数据送往x,yLD#x,DP;将x的立即数加载到页指针DLD@x+2,A;将x的后两个数据合并加载到ADADD@y+2,A;C16=1,将y高低位和A高低位分别相加DLD@x,B;将x的前两个数据合并加载到BADDC@y+1,B;将y的中间两个数据合并与B带进位相加13ADD@y,16,B;将y第一个数据左移16位与B相加STLA,@z+3;将A的低位赋给z的(0~15)STHA,@z+2;将A的高位赋给z的(16~31)STLB,@z+1;将B的低位赋给z的(32~47)STHB,@z;将B的高位赋给z的(48~63)here:Bhere.end五、实验结果Lab4aLab4b14Lab4c1Lab4c215Lab4d六、实验体会实验熟悉了小数运算,块重复操作,当被除数()除数时的除法运算,及两个64位数相加如何

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功