(3)编制链接命令文件 参考程序:
汇编源程序:
.global stAet ; 定义全局变量 .mmregs .data
.bss x,1 ; 开设全局变量(非初始化段) .bss y,1 ; 每个变量占用一个字(16bit) .bss z,1 .text stAet: stm #x,Ae1 ; 取得变量x的地址 stm #y,Ae2 ; 取得变量y的地址 stm #z,Ae3 ; 取得变量z的地址 ST #1,*Ae1 ; 变量赋初值x=1 ST #2,*Ae2 ; y=2 LD *Ae1,A ; 将变量x的值装载到累加器A add *Ae2,A ; 将y的值加到累加器 stl A,*Ae3 ; 将累加器的值的低16位存储到变量z xh: nop b xh ; 空循环 .end
注意:在输入汇编语言源程序时,除了标号以外的程序行必须以一个空格或退格字符开始。
- 保存源程序为TASM.asm。 连接命令文件
MEMORY {
PAGE 0: VECT : o=80h,l=80h PRAM : o=100h,l=1f00h PAGE 1: DRAM : o=2000h,l=1000h }
SECTIONS {
.text : {}> PRAM PAGE 0 .data : {}> PRAM PAGE 0 .cinit : {}> PRAM PAGE 0 .switch : {}> PRAM PAGE 0 .const : {}> DRAM PAGE 1 .bss : {}> DRAM PAGE 1 .stack : {}> DRAM PAGE 1
10
.vectors: {}> VECT PAGE 0 }
注意:第5、6行中等号前边字母是小写的“L”。
- 将文件存为C:\\ICETEK\\VC5416AES60\\VC5416AES60\\Lab0103-ASM\\TASM.cmd (3) 将上述编译的源程序加入工程TASM.pjt,具体操作可请参考实验一 c)编译源文件、下载可执行程序
(1) 选择菜单Project->Rebuild All。 (2) 执行File?Load Program,
四、实验结果分析
1) 打开观察窗口
(1) 选择菜单View->Disassembly。注意程序运行指针停留的位置。
(2) 开启CPU寄存器观察窗口:单击菜单View->Registers->CPU Registers。请看PC指针取值与当前程序运行地址对应。
(3) 将变量x、y、z分别加入观察窗口:
在源程序中双击变量名,再单击鼠标右键,选择“Add to Watch Window”。 这时,这3个变量还未作初始化。 (4) 开启内存观察窗口:
选择“View”菜单中“Memory…”项,在“Memroy Window Options”窗口中的“Adress”项中输入x,单击“OK”完成设置;“Memory”窗口中x的当前取值显示在第1个地址的后。而且y和z的存储单元跟在其后。 2) 观察程序运行结果
(1) 单步运行2次,在观察窗中观察到变量x、y被赋值。变化的值被显示成红色。同时在“Memory”窗口中也能观察到x和y值的改变。
(2) 再单步运行,可观察到z的值被计算出来。双击“Memory”窗口中变量x、y相应的存储单元,将其修改成其他取值,单步运行后观察结果。 3) 对照观察map文件和cmd文件的内容 (1) 选择菜单File->Open…,将找到
C:\\ICETEK\\VC5416AES60\\VC5416AES60\\Lab0103-ASM\\Debug目录,将文件类型改为“Memory Map Files”,选择TASM.map文件、打开。 (2) 打开TASM.cmd文件。
(3) 程序的入口地址:map文件中“ENTRY POINT SYMBOL”中说明了程序入口地址(stAet)。
(4) 内存使用情况:
- map文件中“MEMORY CONFIGURATION”标明了程序占用PAM的使用情况,共占用10H个存储单元。比较一下,这比用C编制的程序占用的要小得多。
- 观察map文件中的“SECTION ALLOCATION MAP”段,可以看出TASM.obj的入口地址为100H,这也是程序的入口地址。
- 用户定义的变量从2000H开始,共占用了3个单元(Word)。
五.问题与思考
1、编写程序,计算y=x1*a1+x2*a2 要求
(1) 在数据存储器中,为4个变量x1、x2、a1、a2预留存储空间。
11
(2) 在程序存储器空间中,定义下列初始化数据: x1:+0.9
x2: +0.8 a1 +0.7 a2: +0.6 Y: +00
(3)利用程序存储器中的初始化数据,来为数据存储器中的各变量赋初值
六.完成实验报告
实验报告要求同实验一。
12
实验3、I/O端口实验
3.1:指示灯控制
一.实验目的
1.了解ICETEK-VC5416-AE板在TMS320VC5416DSP在IO空间上的扩展。 2.了解ICETEK-VC5416-AE板上指示灯扩展原理,.掌握I/O端口的控制方法 3.学习在C语言中使用扩展的控制寄存器的方法。
二.实验设备
计算机,ICETEK-VC5416AE-S60实验箱
三.实验说明
1.I/O空间的扩展及使用:
- ’C54x DSP的I/O空间被保留用于外部扩展。由于在程序中访问I/O空间的语句只有in和out指令,所以在扩展时一般将带有控制能的寄存器或分离地址访问的存储单元的地址映射到I/O空间,访问这部分的单元又称I/O端口访问。例如:可将控制指示灯组的寄存器或锁存器映射到一个I/O端口地址上;A/D、D/A等专用芯片控制端和状态寄存器也常映射到I/O端口上。总之,在I/O空间中扩展的设备一般重点用于控制,而使用大片连续存储空间的存储器单元一般映射到数据空间。 - ICETEK-VC5416-AE板将指示灯、DIP开关、A/D、D/A、异步串行通信接口和WatchDog的控制端等映射在I/O空间。
0001-0001h:WatchDog控制寄存器 3006-3006h:A/D转换控制寄存器 1000-1001h:D/A转换控制寄存器
2000-2007h:异步串口通信控制寄存器 3002-3002h: 板上指示灯控制寄存器
3003-3003h: 板上DIP拨动开关控制寄存器
- ICETEK-VC5416AE-S60实验箱上控制模块也使用I/O端口控制大部分设备:
8001-8001h: 读-键盘扫描值,写-液晶控制寄存器 8002-8002h: 液晶控制寄存器 8003-8004h: 液晶显示数据寄存器
8005-8005h: 发光二极管显示阵列控制寄存器 8006-8006h: 保留
8007-8007h: 发光二极管显示阵列控制寄存器 8008-9FFFh: 保留 - 在程序中,访问I/O端口的语句较为简单。对于汇编语言程序,可用PORTR和PORTW指令,例如,从端口0008h读入一个字到变量x的指令为portr 8,x,而向端口000Ch输出x变量的值的指令为portw #0Ch,x;在C语言中访问I/O端口则必须首先声明I/O端口的类型,然后才能访问,以下语句仍完成上面汇编语言所完成的功能: ioport unsigned int port0008; ioport unsigned int port000C; x = port0008; port000c = x;
13
2.指示灯扩展原理
详见上图,其中7个指示灯是D3-D9;D10在硬件上没做控制扩展。
四. 实验内容
a) 实验程序流程图
开始
一位流水灯循环移位
两位流水灯循环移位
三位流水灯循环移位
b) 打开工程文件
工程文件为:C:\\ICETEK\\VC5416AES60\\VC5416AES60\\Lab0301-LED\\LED.pjt
14