DSP基于CCS向量文件编写和汇编语言设计实验.docx
《DSP基于CCS向量文件编写和汇编语言设计实验.docx》由会员分享,可在线阅读,更多相关《DSP基于CCS向量文件编写和汇编语言设计实验.docx(22页珍藏版)》请在冰点文库上搜索。
DSP基于CCS向量文件编写和汇编语言设计实验
实验三、向量文件的编写及多个文件的链接
一、实验目的
1.编写复位向量文件vectors.asm。
2.多个文件的链接。
3.编写复位和中断向量文件。
4.仿真外部中断。
二、实验条件
Iab3.asm和Iab3.cmd文件
三、实验步骤
1.双击桌面上CCS2图标,启动CCS集成开发环境。
2.建立新工程,并将Iab3.asm和Iab3.cmd添加入工程。
3.按照3.6.4节中的例子,编写复位向量文件vectors.asm并将该文件添加入工程。
4.为了将Iab3和vectors两个文件相链接,对Iab3.asm和
Iab3.cmd文件进行必要的修改。
5.用菜单命令对工程的所有文件进行汇编、编译、链接生成输出文件。
6.加载程序并单步执行Iab3.out文件,仔细观察复位向量的作用。
7.参看教材4.4节中的内容,仿真外部中断INT2:
1在Iab3.asm中,增加一段中断服务子程序INT_2.dat,其内
容将累加器A变负
2修改Iab3.asm,开放INT2中断。
3修改vectors.asm,增加INT2中断向量。
4编写仿真外部中断用的数据文件,文件名为INT_2.dat,每隔
100个时钟周期向CPU发出一次中断请求,直到仿真结束。
5对工程中所有文件重新汇编、编译、链接生成新的输出文件。
6执行前,从Tool菜单中选择,用鼠标选中要连接PinName再按connect按钮,选择输入文件INT_2与INT2引脚相连,单击打开按钮。
7加载程序,并利用单步方式执行程序,注意观察中断向量在程序执行过程中的作用。
四、实验程序
************************************************
lab3.asm
y=a1*x1+a2*x2+a3*x3+a4*x4
************************************************
.def
INT_2
.data
;定义数据段
.mmregs
table:
.word
123,4
;为标号table开始的
.word
8,6,4,2
;8个存储单元赋初值
.text
;定义文本段
start:
STM
#STACK+10h,SP
;设置堆栈指针
STM
#table,AR1
;AR1指向table的首地址
STM
#x,AR2
;AR2指向x的首地址
STM
#7,AR0
;将AR0赋7
LD
#40h,A
;将立即数40h加载到A累加
as.器
STM
#0,SWWSR
;SWWSR置0,不插等待周期
RSBX
INTM
;开放全部可屏蔽中断
STM
#04h,IMR
;开放INT2中断
loop:
LD
*AR1+,A
;将AR1中数据加载到A累加
as.器
STL
A,*AR2+;将A低16位送往AR2寄存器所指地
址
BANZ
loop,*AR0-
;重复执行7次
CALL
SUM
;调用SUM子程序
end:
B
end
;循环等待
SUM:
STM
#a,AR3;AR3指向a的首地址
STM
#x,AR4;AR4指向x的首地址
RPTZ
A,#3;将A清零,重复执行下条指令3
次
MAC
*AR3+,*AR4+,A相乘累加存入A累加器
STL
A,*AR2将A的低16位送往AR2所指向的地址
RET
;子程序返回
INT_2:
NEGA
;将A累加器变负
RETE
;开中断,从中断返回
.end
;程序结束
五、实验现象
每隔100个时钟周期来一次中断,累加器A中的数值变负
六、实验体会
学习了如何设置中断,及源程序和向量文件的链接,编写仿真外
部中断的数据文件,更直观的认识到程序是如何执行中断的
实验四汇编语言程序设计
一、实验目的
通过实验熟悉指令系统,初步掌握汇编语言程序设计的基本方法和技巧。
二、实验条件
在第五章基础上进行。
三、实验内容
5
萨二〉aixi
1•编写实验r小数乘法累加的汇编语言程序Iab4a.asm。
其中a二{0.1,020.3,0.4,0.5卜
2.将第五章例9和例10组合成一个程序Iab4b.asm,实现对一个
数组x[5]={1000h,2000h,3000h,5000h}进行初始化,并利用块重复操作指令将该数组每个元素加一。
3.将第五章中的例20或例21,分别编写成完整的除法运算程序
Iab4c1.asm禾口Iab4c2.asm。
4.编写实现两个64位数相加的汇编语言程序Iab4d.asm
5•在设计好上述每一个汇编语言程序的同时,均应设计相应的链
接命令文件Iab4x.cmd,并利用CCS进行调试
四、实验程序
Iab4a
*****************************************************
Iab4a.asm
y=a1*x1+a2*x2+a3*x3+a4*x4+a5*x5
*****************************************************
.title"Iab4a.asm"
.mmregs
.data
table:
.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
start:
SSBX
FRCT
;将小数方式位状态寄存器置一
STM
#STACK+10h,SP;设置堆栈指针
STM
#table,AR1
;AR1指向table的首地址
STM
#x,AR2
;AR2指向x的首地址
STM
#9,AR0
LD
#0,A
loop:
LD
*AR1+,A
;将AR1中数据加载到A累加
器
STL
A,*AR2+;
将A低16位送往AR2寄存器所指地
址
BANZ
loop,*AR0-
;重复执行9次
CALL
SUM
;调用SUM子程序
end:
B
end
;循环等待
SUM:
STM
#a,AR3
;AR3指向a的首地址
STM
#x,AR4
;AR4指向x的首地址
RPTZ
A,#4
;将A清零,重复执行下条指令4
次
MAC
*AR3+,*AR4+,A相乘累加存入A累加器
STH
A,y
;将A的高16位送往y
RET
;子程序返回
.end
;程序结束
Iab4b
.title"Iab4b.asm"
.mmregs
;定义存储器映像寄存器
;给x分配5个存储单元
.bss
x,5
.def
start
;疋义标号start
.data
;定义数据段
table
.word
1000h,2000h,3000h,4000h,5000h
;为标
:
号table开始的
5个存储单元赋初值。
.text
;定义文本段
start:
STM
#x,AR2
;AR2指向x的首地址
RPT
#4
;重复下条指令4次
MVPDtable,*AR2+
;重复传递共5个数据
next:
LD
#1,16,B
;将1左移16位加载到B累加器
STM
#4,BRC
;将块重复计数器赋值为4
STM
#x,AR4
;AR4指向x的首地址
RPTB
end-1
;循环执行下面语句,end-1为结束地
址
ADD
*AR4,16,B,A
将AR4中数据左移16位加B赋给A
STH
A,*AR4+;
将A高16位送往AR4寄存器所指地
址
end:
B
end
;循环等待
.end
;程序结束
Iab4c1
・**************
;*lab4c1.ASM
・**************
.def
start
STACK
.usect
"STACK",100;给堆栈分配
元
.bss
num,1
.bss
den,1
.bss
quot,1
.data
table:
.word
-128;4*32768/10
;为标号
table开始的4个存储单元赋初值
.word
1024;-8*32768/10
.title"lab4c1.asm"
100个存储单
;分别是-128,0.4,1024,-0.8
.text
start:
STM#num,AR1
RPT#1;重复执行下条语句1次
MVPDtable,*AR1+;传送2个数据至分子、分母单元
LDden,16,A;将分母移到A累加器(31-16)
MPYAnum
;(num)*(A(32-16))移到B,获取商的符号
ABSA
STHA,den
LDnum,16,A
ABSA
RPT#14
SUBCden,A
XC1,BLT
号
NEGA
STLA,quot
done:
Bdone
;分母取绝对值
;分母绝对值存回原处
;分子移到A(32-16)
;分子取绝对值
;15次减法循环,完成除法
;有条件减法
;如果B<0(商是负数),则需要变
;将A累加器变负
;将A的低16位送往quot
.end
Iab4c2
・**************
J
;*lab4c2.ASM
・**************
.title"lab4c2.asm"
.defstart
.bssnum,1
.bssden,1
.bss
quot,1
.data
table:
.word16384;66*32768/100
;为标号table开始的4个存储单元赋初值
.word512;-33*32768/100
分别是16384,0.66,512,
-0.33
.text
STM
#num,AR1
RPT
#1
;重复执行下条语句1次
MVPD
table,*AR1+
;传送2个数据至分子、分母单元
LD
den,16,A
;将分母移到A累加器(31-16)
MPYA
num
;(num)*
(A(32-16))移到B,获取商的符号
ABS
A
;分母取绝对值
STH
A,den
;分母绝对值存回原处
LD
num,A
;分子移到A
ABS
A
;分子取绝对值
SUB
den,A
;从累加器A中减去den中数据
start:
BCnext,ALT
;条件分支转移,A<0,则执行next子程序
ADD
den,A
;在累加器A中加上den中数据
RPT
#15
;重复下条语句15次
B
next1
;执行next1子程序
next:
LD
num,16,A
;分子移到A(32-16)
ABS
A
;分子取绝对值
RPT
#14
;重复下条语句14次
SUBC
den,A
;有条件减法
nextl:
XC
1,BLT
;如果B<0(商是负数),则需要变
号
NEG
A
;将A累加器变负
STL
A,quot
;将A的低16位送往quot
done:
B
done
.end
Iab4d
;lab4d.asm
.title
"lab4d.asm"
.def
start
table:
.word
4000h
;x3
.word
OfOOOh
;x2
.word
OfOOOh
;x1
.word
OfOOOh
;x0
.word
4000h
;y3
.word
3000h
;y2
.word
2000h
;y1
.word
1000h
;y0
.bss
x,4
.bss
y,4
.bss
乙4
.text
start:
STM
#x,AR1
;AR1指向x的首地址
RPT
#7
;重复执行下条语句7次
MVPDtable,*AR1+
;将table中的8个数据送往x,y
LD
#x,DP
;将x的立即数加载到页指针
DLD
x+2,A
;将x的后两个数据合并加载到A
DADDy+2,A
;C16=1,将y高低位和A高低位分别相加
DLD
x,B
;将x的前两个数据合并加载到B
ADDCy+1,B;将y的中间两个数据合并与B带进位相加
ADD
y,16,B
;将y第一个数据左移
16位与B相加
STL
A,z+3
;将A的低位赋给z的
(0~15)
STH
A,z+2
;将A的高位赋给z的
(16~31)
STL
B,z+1
;将B的低位赋给z的
(32~47)
STH
B,z
;将B的高位赋给z的
(48~63)
B
here
.end
五、实验结果
Lab4a
OuOO&OQOGA
0^0000
OkOOOO
C>mO€00
oxoooooosn
0x0000
OxOdOO
0x0000
OxOOOOOOCO
■«・
=
OxOOOOOO^O
OxOCCC
0x1^99
0x2<€€
0^000"0
0X3333
OmIO-OO
■
03C0000004S
OxOCCC
0X1»99
0x2««6
OacOO&OOOCG
0x3333
0x4000
03COOOOOO€A
7
0x00^0
Ox4CCS
0tcO<5O0OO-€B
nd,s-nd
OacDOOOQO^B
0XDOOQ
OXQOOO
OXQCOO
DsOOODOC«E
O3ff0O"OO
OkO&OO
0x0000
0x00000071
0x0000
0x0000
□xOCOO
O3cO0^OOOT4
Dx.00OO
OmO^OO
0>c0000
OmOO^OOOT?
DxOOOO
OxO^OD
OxOOCO
0X00^000TA
0x0000
OMOO0O
^XOCOO
owoooooo^r
OkOOOO
0x0000
f)wOCJOO
oacDCOOQoeo
STACK
OacOG&OOOSO
OmOOOO
OkOOOO
OscOCOO
•*
fi-^nnnin
A
ftvH^firi
z
丿回1叫1
BBit-y|jTlat〒|
uKyj
Lab4b
IdsGO
d
0x00000060
xrbss
$-bss
O曲口008"
OitlOOL
OjtSOOl
Oit^OOl
>1
OKOOOOOQg^
QJC4O0L
QJC4OC1
-
0x0000006S
_*Eid,e
nd
zd
Oj£OOCOOO€»
OjicOOOO
OjtOOOO
Oi&COOO
□Kjoooooee
OjeOOOO
OjcOOOO
OxCODO
0x0ODO00€B
0x0000
OjcOOOO
DxOCig
OjmdDOOOOOCE
0x0000
0x0000
0xCQ0O
0x00000071
oxoooa
0x0000
OxCODO
CkO0000074
owoona
OxCOOO
0x0000
Ox€0000077
OjlOOOO
OjtOOOO
0xOOOO
0XSOOOOO7A
OmOOOO
OxCOOC
0x0000
OkCOOOOOTD
OsrOOOO
OkCOOO
0wOOOO
oxooocooe^
OjLOOQD
ojacood
OXCOOO
OxOOOOOOS^
OmOOOD
OkOOOC
oxoaoo
Ox^OOOOOtC
0x0000
OkOOOO
Om-COOO
QXQQQOQQS?
0X0口i□口
QXOQDQ
QKQ口口口
0x000000BC
OxOCOD
0x0000
OkOOOO
Om^OOOOOSF
OxODOO
OkOOOQ
OkCOOO
"T
0x^0000092
OkOCOO
0x0000
OwCOOD
M
已ennnnnet
nTnnnn^
n
Pi停門门
」菅晦i
6Bii*|Data仃|
Lab4c1
Lab4c2
jOxfiO
OxOOOOOOGO
tlushfbi
5sr„bss
X
&xOOOOOOGG
0jk4OOO
DkOOCODOEI
den
DxOOOOOOEL
OirOSOQ
Dm:
OOOOOQ£2
EJUOt
OmO0000062
OjtOOZO
oxoocoocfia
_jandfend
OxOOOOOOGS
oxoooa
OkOOOO
0cx€000
OxOOCOOOG€
0x0000
0x0000
0x0000
OxOOOOOO£»
0x0000
O-xOOOO
0x0000
0x000000GC
0x0000
0x0000
0x0000
&X0000006F
OjcOOOO
OxOCOO
CxCOOO
0x00000072
OjeOOOC
OicD匚DO
OjcCODO
&X0000007&
OjeOODC
OjcOl00
OjcOCOC
GxOOOOOOTS
0^0000
OjcOCDC'
OjhlCQDC
DkOOCODOIb
OjxOOGO
OjcDCOD
OjcCODO
OxOOCODfl7E
0^0000
OjcDOOO
OKOOoocaeo
STACK
OmOOCODO^O
OjeOOOO
OkDCOO
O-kOOOO
T-
oxooooooes
OjcOOOO
Ox0C0O
OjpOOOO
ftvrtmnririo-c
Hjrnnn
nv^nrbnfi
ftv/^nnn
|He^1
6EitTpJataT
Lab4d
OjlOOOOODGO
Hr_-t]S3
X
Djtoocooaei?
0X4OOQ
DjeFODO
CjhlFQDO
去
0x00000053
OxFOOO
&XOOCOOOG4
y
OxOOOOOOn4
0x4000
Ojc3COO
Ojt^OOO
&X.OOOOOOS7
OjkIOOO
&xOOOOOOG£
z
DkOOCODOG^
OjcEODI
DjcZCDL
OjcIODI
OmOOCJODOEE
0^0000
0x0000006C
_end.
end
GxOOOOOOGC
0x0000
OkOOOO
OkOCDO
OxOOOOaOGF
0x0000
0x0000
0x0000
0x00000072
OjcOOOO
OjcOOOD
OxCOOO
OitOOOODOIS.
OxDOOO
OjcCODC
0^00000078
OaOQOO
QxQQOj
iJjlCCDC
DmOOOOOOVB
DjeOOOO
DjeOOOO
OjcOOOO
0x000000TE
0x0000
OkOCOO
O-xCOOO
OxOOCOOOBL
0x0000
0x0000
0x0000
0x00000064
0x0000
0x0000
0x0000
«>xOOCOOO07
OjtOOOO
OjcOOOD
OxCODO
*
nvnnriA
z
J旨|H*论贺韭二二
六、实验体会
实验熟悉了小数运算,块重复操作,当被除数>(<)除数时的除
法运算,及两个64位数相加如何处理进位问题。