基本算数运算(DSP实验报告)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本算数运算
一、实验目的和要求
加、减、乘、除是数字信号处理中最基本的算术运算。DSP 中提供了大量的指令来实现这些功能。本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法和编程技巧。本实验的演示文件为exer1.out。
二、实验原理
1) 定点DSP 中的数据表示方法
2) 实现16 位定点加法
ld temp1,a ;将变量temp1 装入寄存器A
add temp2,a ;将变量temp2 与寄存器A相加,结果放入A中stl a,add_result ;将结果(低16 位)存入变量add_result 中3)实现16 位定点减法
stm #temp1,ar3 ;将变量temp1 的地址装入ar3 寄存器
stm #temp3,ar2 ;将变量temp3 的地址装入ar2 寄存器
sub *ar2+, *ar3,b ;将变量temp3 左移16 位同时变量temp1 也左移16 位,然后相减,结果放入寄存器B(高16位)中,同时ar2 加1。
sth b,sub_result ;将相减的结果(高16位)存入变量sub_result 4)实现16 位定点整数乘法
rsbx FRCT ;清FRCT标志,准备整数乘
ld temp1,T ;将变量temp1 装入T 寄存器
mpy temp2,a ;完成temp2*temp1,结果放入A寄存器(32 位)5)实现16 位定点小数乘法
我们使用下列
ssbx FRCT ;FRCT=1,准备小数乘法
ld temp1,16,a ;将变量temp1 装入寄存器A的高16位
mpya temp2 ;完成temp2 乘寄存器A的高16 位,结果在B中,同时将temp2 装入T 寄存器
sth b,mpy_f ;将乘积结果的高16 位存入变量mpy_f
6)实现16 位定点整数除法
代码如下:
ld temp1,T ;将被除数装入T 寄存器
mpy temp2,A ;除数与被除数相乘,结果放入A寄存器
ld temp2,B ;将除数temp2 装入B 寄存器的低16位
abs B ;求绝对值
stl B,temp2 ;将B 寄存器的低16 位存回temp2
ld temp1,B ;将被除数temp1 装入B寄存器的低16 位
abs B ;求绝对值
rpt #15 ;重复SUBC 指令16 次
subc temp2,b ;使用SUBC 指令完成除法运算
bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A>0,则跳转到标号div_end,结束除法运算
stl B,quot_i ;将商(B寄存器的低16 位)存入变量quot_i sth B,remain_i ;将余数(B 寄存器的高16 位)存入变量remain_i
xor B ;若两数相乘的结果为负,则商也应为负。先将B 寄存器清0
sub quot_i,B ;将商反号
stl B,quot_i ;存回变量quot_i 中
div_end:
7)实现16 位定点小数除法
代码如下:
ld temp1,T ;将被除数装入T 寄存器
mpy temp2,A ;除数与被除数相乘,结果放入A寄存器
ld temp2,B ;将除数temp2 装入B 寄存器的低16位
abs B ;求绝对值
stl B,temp2 ;将B 寄存器的低16 位存回temp2
ld temp1,16,B ;将被除数temp1 装入B寄存器的高16 位abs B ;求绝对值
rpt #15 ;重复SUBC 指令16 次
subc temp2,b ;使用SUBC 指令完成除法运算
and #0ffffh,B ;将B 寄存器的高16 位清为0。这时余数被丢弃,仅保留商
bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,
若A>0,则,跳转到标号div_end,结束除法运算
stl B,-1,quot_f ;将商右移一位后存入变量quot_f,右移是为了修正符号位
xor B ;若两数相乘的结果为负,则商也应为负。先将B 寄存器清0
sub quot_f,B ;将商反号
stl B,quot_f ;存回变量quot_f中
div_end:
三、实验内容
1) 编写实验程序代码
本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句:nop,当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见附录。
2)用ccs simulator 调试运行并观察结果
在完成实验程序代码的输入,并使用ccs 进行编译并连接,得到out 文件后,就可以在simulator上调试运行。步骤如下:
a.启动ccs simulator。
b.点击file ->load program,找到exer1.out 并装入。这时可在反汇编窗口看到程序代码。
c.打开“Memory”窗口,并在其中选择要查看的存贮器地址段:0x080
-0x08e。
d.在反汇编窗口中在每个“nop”指令处都设一个断点,方法有两种:1.用鼠标双击该指令将其点亮即可。2.在菜单栏中选择debugÆbreakpoint,然后在弹出的对话框中键入欲加断点的地址即可(注意地址的格式)。
e.单击Run 快捷键(或者F5 按钮),启动执行基本算术运算程序,程序在执行完加法运算后自动暂停。通过register window 窗口可以看到寄存器A的内容为0x46,这正是加法运算的结果。同样,在Memory 窗口中,可以看到0x81,0x82,0x88 的内容为分别为0012,0034,0x46。执行加法运算后,将0x81 和0x82 的内容相加,结果放在0x88 单元。
f.在Memory 窗口中用鼠标左键双击0x81 单元,这时可以修改该内存单元的内容。输入新的数据0x0ffee(十进制的-18),编辑内容时请直接输入FFEE(十六进制),然后回车确认,便完成对0x81 单元的修改。
g.在register window窗口中修改PC 值,方法也是鼠标左键双击PC 寄存器的内容,输入新的PC 值0x1085(编辑内容时直接输入1805),并用回车键确认。
h.单击Run 快捷键(或者F5 按钮),程序从当前PC 继续运行,重新计算0x81和0x82的和,结果在0x88 中。当程序再次暂停时,可以看到A寄存器和0x88 的内容为0x22(十进制的34),这正是我们希望的结果:-18+52=34。