DSP汇编语言编程基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二 DSP汇编语言编程基础
一、 实验目的
1、了解DSP的寻址方式;
2、了解DSP的汇编语言与C语言混合编程。

二、 实验器材
1、安装有CCS的PC机一台;
三、 实验内容
1、建立一个工程;
2、用汇编语言编程实现一个可被C程序调用的例程。

四、 实验步骤
1、汇编语言和C语言混合编程:
(1) 运行CCS,建立一个工程,取名exp2a,并保存到c:\ti\myprojects\xxx\Experiment2\目录下。

(2) 编辑如下C文件,取名exp2a.c并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。

/* Assembly routine */
extern int sum(int *);
/* define x[] as global array */
int x[2]={0x1234,0x4321};
/* define result s as global variable */
int s;
void main()
{
s = sum (x); /* return sum product */
}
(3) 编辑如下汇编文件,取名exp2_sum.asm并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。

* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* exp2_sum.asm SUM subroutine
* called by exp2a.c
* Input: Array pointer
* Output: Return sum result in T0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
.global _sum
_sum
mov *AR0+,AC0 ; AC0 = x[1]
add *AR0+,AC0 ; AC0 = x[1]+x[2]
mov AC0,T0
ret ; Return T0
.end
(4) 编辑如下链接命令文件,取名link.cmd并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。

-c
-stack 0x800
-sysstack 0x200
-m link.map
MEMORY {
DARAM: origin = 0x200, len = 0xfe00
SARAM: origin = 0x10000, len = 0x30000
VECT: origin = 0x100, len = 0x100
SDRAM: origin = 0x80000, len = 0x380000
Flash: origin = 0x400000, len = 0x3e0000
CPLD: origin = 0x800000, len = 0x20000
}
SECTIONS
{
.vectors: {} > VECT
.cinit: {} > SARAM
.text: {} > SARAM
.stack: {} > SARAM
.sysstack {} > SARAM
.sysmem: {} > SARAM
.cio: {} > SARAM
.data: {} > SARAM
.bss: {} > SARAM
.const: {} > SARAM
.gblinit: {} > SARAM
frt: {} > SARAM
.pinit: {} > SARAM
.sysinit: {} > SARAM
.far: {} > SARAM
.switch: {} > SARAM
.MEM$obj: {} > SARAM
.sysheap: {} > SARAM
}
(5) 选择Project-Options-Linker-Library标签,添加实时支持库rts55.lib。

(6) 编译并链接工程,下载exp2a.out,并选择Go-Main命令。

(7) 观察并记录CPU寄存器窗口中AC0、AR0、T0的值,观察memory中s 和x的内容,并记录s的值。

(8) 重新单步执行C代码和汇编代码,观察C编译器产生的汇编代码exp2a.asm,注意汇编程序的返回值是如何被传递到C调用程序的。

2、寻址方式实验。

(1) 编辑如下C文件,取名为exp2b.c,并保存到c:\ti\myprojects\xxx\Experiment2\目录。

/* ---------------------------------------
exp2b.c
Interfacing C with Assembly Langugage
and using Different Addressing Modes
------------------------------------------*/
extern void exp2b_1(void);
extern void exp2b_2(void);
extern int exp2b_3(int *, int *);
extern int exp2b_4(int *, int *);
int Ai[8];
int Xi[8];
int result1,result2;
void main()
{
exp2b_1();
exp2b_2();
result1 = exp2b_3(Ai, Xi);
result2 = exp2b_4(Ai, Xi);
}
(2) 编辑如下汇编程序exp2b_1.asm,采用绝对寻址对数组Ai进行初始化,Ai[8]={1,2,3,4,5,6,7,8}。

并保存到c:\ti\myprojects\xxx\Experiment2\目录。

* * * * * * * * * * * * * * * * * * * * * * * * * * *
* exp2b_1: Absolute Addressing Mode
* * * * * * * * * * * * * * * * * * * * * * * * * * *
.def _exp2b_1
.ref _Ai
.text
_exp2b_1
; (1) Absolute addressing
mov #1,*(_Ai) ; Absolute addressing mode
mov #2,*(_Ai+1) ; Initialize Ai[8]={1,2,3,4,5,6,7,8}
mov #3,*(_Ai+2)
mov #4,*(_Ai+3)
mov #5,*(_Ai+4)
mov #6,*(_Ai+5)
mov #7,*(_Ai+6)
mov #8,*(_Ai+7)
ret
.end
(3) 编辑如下汇编程序exp2b_2.asm,采用间接寻址对数组X进行初始化,Ai[8]={9,3,2,0,1,9,7,1}。

并保存到c:\ti\myprojects\xxx\Experiment2\目录。

* * * * * * * * * * * * * * * * * * * * * * * * * * *
* exp2b_2: Direct Addressing Mode
* * * * * * * * * * * * * * * * * * * * * * * * * * *
.def _exp2b_2
.ref _Xi
.text
_exp2b_2
; Direct addressing
btstclr #14,*(ST1),TC1 ; Turn off CPL bits for direct addressing mode
bclr C54CM
amov #_Xi,XDP ; Load direct addressing data-page pointer
.dp _Xi
mov #9,@_Xi ; Direct addressing mode
mov #3,@_Xi+1 ; Initialize Xi[8]={9,3,2,0,1,9,7,1}
mov #2,@_Xi+2
mov #0,@_Xi+3
mov #1,@_Xi+4
mov #9,@_Xi+5
mov #7,@_Xi+6
mov #1,@_Xi+7
xcc continue,TC1
bset CPL ; Turn CPL bit back on
continue
ret
.end
(4) 编辑如下汇编程序exp2b_3.asm,采用间接寻址实现Ai和X的点乘。

并保存到c:\ti\myprojects\xxx\Experiment2\目录。

* * * * * * * * * * * * * * * * * * * * * * * * * * *
* exp2b_3: Indirect Addressing Mode
* * * * * * * * * * * * * * * * * * * * * * * * * * *
.def _exp2b_3
.text
_exp2b_3
; Indirect addressing
mpym *AR0+,*AR1+,AC0
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mpym *AR0+,*AR1+,AC1
add AC1,AC0
mov AC0,T0
ret
.end
(5) 编辑如下汇编程序exp2b_4.asm,采用间接寻址,使用并行指令和重复指令提高代码的效率,减少代码长度。

并保存到c:\ti\myprojects\xxx\Experiment2\目录。

* * * * * * * * * * * * * * * * * * * * * * * * * * *
* exp2b_4: Paralle Processing
* * * * * * * * * * * * * * * * * * * * * * * * * * *
.def _exp2b_4
.text
_exp2b_4
; Indirect addressing with paralle processing
mpym *AR0+,*AR1+,AC0
|| rpt #6
macm *AR0+,*AR1+,AC0
mov AC0,T0
ret
.end
(6) 在c:\ti\myprojects\xxx\Experiment2\目录下建立工程exp2b,将link.cmd、exp2b.c、exp2b_1.asm、exp2b_2.asm、exp2b_3.asm和exp2b_4.asm加入工程,编译、连接工程,并下载exp2b.out。

(7) 在memory watch窗口观察Ai和Xi的初始化值,在CPU寄存器窗口观察点乘的计算过程。

(8) 对exp2b_3.asm和exp2b_4.asm的性能进行分析。

五、 实验报告
1、简述C和汇编混合编程中的参数是如何传递的。

2、若将exp2a中的s定义放入main( )函数中,应到哪个位置观看其内容?
为什么?
3、对本次实验作出小结。

相关文档
最新文档