实验3 :编写一个以汇编(ASM)语言为基础的DSP程序
一. 实验目的
1.学习用汇编语言编制程序;了解汇编语言程序与C语言程序的区别和在设置上的不同。
2.了解TMS320C28x汇编语言程序结果和一些简单的汇编语句用法。
3.学习在CCS环境中调试汇编代码。
二. 实验原理
1. 汇编语言程序
汇编语言程序除了程序中必须使用汇编语句之外,其编译选项的设置与C语言编制的
程序也稍有不同。其区别为:
(1)汇编语言程序在执行时直接从用户指定入口开始,常见的入口标号为“start”,而C语言
程序在执行时,先要调用C标准库中的初始化程序(入口标号为“_c_init00”),完成设置
之后,才转入用户的主程序main()运行。
(2)由于CCS的代码链接器默认支持C语言,在编制汇编语言程序时,需要设置链接参数,
选择非自动初始化,注明汇编程序的入口地址。
2.程序设计要求
程序框图:
三. 实验设备
PC兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为
Windows2000),安装Code Composer Studio 2.2软件。
四.实验内容与步骤
1.实验准备
设置软件仿真模式,参看:第一部分、四、1。
2.建立新的工程文件
(1)双击桌面上图标,
启动Code Composer Studio 2.21。
(2)进行以下设置:
图3-2 设置工程文件
4.编辑输入源程序
(1)汇编语言程序
-
图3-3 新建源文件
先新建源程序窗口:
-输入源程序:
.global start
start:
MOV @AR1,#9000 ;给ar1寄存器赋值
LOOP:
ADDB SP,#3 ;此时sp指针为403h地址
MOV *-SP[1],#10 ;把立即数10 放到402地址上
MOV *-SP[2],#1 ;把立即数1放到401地址上
MOV AL,*-SP[2] ;把401 地址上数据读出放到AL寄存器中
ADD AL,*-SP[1] ;把401 和402地址中数据做加法运算,把结果放到AL寄存
器中
MOV *-SP[3],AL ;把AL中值放到400h地址中
nop ;空指令
nop
SUBB SP,#3 ;设置sp指针为400h地址
BANZ LOOP,AR1-- ;有条件跳转,只要ar1中的值不为0
.end
-保存源程序为TASM.asm。
(2)连接命令文件
-如同第(1)步操作,建立空的源程序窗口。
-输入连接命令文件内容:
-stack 400h
-heap 100
MEMORY
{
PAGE 0 : PROG(R) : origin = 0x80000, length = 0x10000
PAGE 0 : BOOT(R) : origin = 0x3FF000, length = 0xFC0
PAGE 0 : RESET(R) : origin = 0x3FFFC0, length = 0x2
PAGE 0 : VECTORS(R) : origin = 0x3FFFC2, length = 0x3E
PAGE 1 : M0RAM(RW) : origin = 0x000000, length = 0x400
PAGE 1 : M1RAM(RW) : origin = 0x000400, length = 0x400
PAGE 1 : L0L1RAM(RW) : origin = 0x008000, length = 0x2000
PAGE 1 : H0RAM(RW) : origin = 0x3F8000, length = 0x2000
}
SECTIONS
{
/* 22-bit program sections */
.reset : > RESET, PAGE = 0
vectors : > VECTORS, PAGE = 0
.pinit : > PROG, PAGE = 0
.cinit : > PROG, PAGE = 0
.text : > PROG, PAGE = 0
/* 16-Bit data sections */
.const : > L0L1RAM, PAGE = 1
.bss : > L0L1RAM, PAGE = 1
.stack : > M1RAM, PAGE = 1
.sysmem : > M0RAM, PAGE = 1
/* 32-bit data sections */
.ebss : > H0RAM, PAGE = 1
.econst : > H0RAM, PAGE = 1
.esysmem : > H0RAM, PAGE = 1
}
-将文件存为C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\lab0103-Asm\TASM.cmd
(3)将上述编译的源程序加入工程TASM.pjt。
5.编译源文件、下载可执行程序
(1)选择菜单Project->Rebuild All。
(2)执行FileàLoad Program,在随后打开的对话框中选择刚刚建立的
C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\lab0103-Asm\debug\TASM.out 文件。完成
后,系统自动打开TASM.asm源程序窗口,并在其中指示程序的入口地址为标号“start”
后的语句。
6.打开观察窗口
(1)选择菜单View->Disassembly。注意程序运行指针停留的位置。
(2)开启CPU寄存器观察窗口:单击菜单View->Registers-> core。看PC指针取值与当前程
序运行地址对应。此处为0x80000。
(3)单击菜单View->Registers->Pseudo。看AL寄存器,此时应为0。如果AL寄存器的值不
为0,请点击Debug->Reset Cpu, 对2812 芯片进行复位。
(4)开启内存观察窗口:
选择“View”菜单中“Memory…”项,在“Memroy Window Options”窗口中的“Adress”
项中输入0x400,单击“OK”完成设置。
7.观察程序运行结果
(1)单步运行1次(按F10 快捷键即可),在观察窗中观察到AR1 寄存器被赋值0x9000。
(2)再单步运行3 次,将看到内存窗口中0x402 被赋值0x10,0x401地址被赋值0x1。
(3)再单步运行3 次,可观察0x400 地址中的值变为0xb,此数据就是把0x402 和0x401 地址
中数据相加得到的。
可以修改下面两句语句的立即数值,重新编译,然后单步运行观察结果。
MOV *-SP[1],#10 ;把立即数10 放到402 地址上
MOV *-SP[2],#1 ;把立即数1放到401 地址上
8.对照观察map文件和cmd文件的内容
(1)选择菜单File->Open…,将找到
C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\lab0103-Asm\Debug目录,将文件类型改
为“Memory Map Files”,选择TASM.map文件、打开。
(2)打开TASM.cmd文件。
(3)程序的入口地址:map文件中“ENTRY POINT SYMBOL”中说明了程序入口地址(start)。
(4)内存使用情况:
-map文件中“MEMORY CONFIGURATION”标明了程序占用RAM 的使用情况,共占用
fH 个存储单元。比较一下,这比用C编制的程序占用的要小得多。
-观察map文件中的“SECTION ALLOCATION MAP”段,可以看出TASM.obj的入口地
址为80000H,这也是程序的入口地址。
9.退出CCS
五.预习要求
1.熟悉汇编语言,了解常用的汇编语言程序设计方法。
2.了解DSP内存的分配情况。
六.注意事项
1.在输入汇编语言源程序时,除了标号以外的程序行必须以一个空格或退格字符开始。
2.由于本实验的主程序为汇编语言,所以要把它设置为汇编模式才能正常工作。
七.思考题
修改程序完成0f000h+0e000h的计算。
八.实验报告要求
1.汇编语言程序从指定位置开始运行,但汇编程序需要对运行环境的初始化工作。
2.实验中的程序有堆栈操作,所以初始化堆栈指针。
3.编译后,各寄存器和内存窗口的变化