/*
constant define /* x=45 */ /* y=64 */
*/
/*----------------------------------------------------------------------------------------------------------*/ .equ x, 45 .equ y, 64 .global _start
/*-----------------------------------------------------------------------------------------------------------*/ /* .text _start:
stop: .end
b
stop
/* end the code ,cycling */
/* code start */ /* put x value into R0 */
/* save the value of R0 into stacks */ /* put y value into R0 */
/* read the data from stack,and put it into R1 */
mov mov str mov ldr add str
sp, #stack_top r0, #x r0, [sp] r0, #y r1, [sp] r0, r0, r1 r0, [sp]
code
*/
/*-----------------------------------------------------------------------------------------------------------*/
.equ stack_top, 0x1000 /* define the top address for stacks */
3.1.7 练习题
1. 编写程序循环对R4~R11进行累加8次赋值,R4~R11起始值为1~8,每次加操作后把R4~R11的内容放入SP栈中,SP初始设置为0x800。最后把R4~R11用LDMFD指令清空赋值为0。
2. 更改实验A中x、y的值,观察执行结果。
31
3.2 C语言程序实验一
3.2.1 实验目的
? 学会使用Embest IDE编写简单的C语言程序并进行调试; ? 学会编写和使用命令脚本文件;
? 掌握通过memory/register/watch/variable窗口分析判断运行结果。
3.2.2 实验设备
? 硬件:PC机。
? 软件:Embest IDE Pro ARM集成开发环境,Windows 98/2000/NT/XP。
3.2.3 实验内容
利用命令脚本初始化栈指针,并使用c语言完成延时函数。
3.2.4 实验原理
1. 命令脚本文件
用户在集成环境与目标板连接时、软件调试过程中以及复位目标板后,有时需要集成环境自动完成一些特定的功能,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等,这些特定的功能可以通过执行一组命令序列完成,保存一组命令序列的文本文件称为命令脚本文件(EmbestIDE使用.cs作为命令脚本文件扩展名)。
命令脚本文件中各行以半角格式的“;”号开始作为注释内容,分号前是一条命令。凡是可以在调试命令窗口使用的命令,都可以在脚本文件中使用,包括执行脚本文件命令“SCRIPT”。调试命令及详细请参照Embest IDE所带的文档UserGuide.chm中“调试命令列表”一节。
命令脚本文件执行时按照命令在脚本文件中排列的先后顺序自动连续地执行。 2. 命令脚本文件的执行方法 命令脚本文件有两种执行方法: ?
在命令输入窗口,输入: script 脚本文件名
?
在项目设置对话框调试属性页指定连接后的行为(Action after connected),此时,
可选择命令脚本文件(Command script),并在编辑框中设定命令脚本文件名,则在IDE与目标系统连接后首先自动执行指定的脚本文件。 3. 常用命令介绍 1) GO – 执行程序 说明:
从当前PC执行目标程序。
2) MEMWRITE – 存储区写 语法: 说明: 选项: 示例:
memwrite [–e] 地址 数值 向存储区指定地址写入数值。 -e 大印第安方式写入 memwrite 0x1000 0x5A 向地址0x1000处写入数值0x5A
32
memwrite -e 0x2000000 0x22334455
等效于memwrite 0x2000000 0x55443322
3) REFRESH – 刷新窗口 说明:
刷新所有窗口命令,调试命令执行后,各窗口相关内容并不更新,用户可以调用本命令刷新界面各窗口保持与实际内容一致。
4) REGWRITE – 寄存器写 语法: 示例:
regwrite 寄存器名称 寄存器值 regwrite pc 0x3840
向PC寄存器写入数值0x3840
5) RESET – 复位目标设备 6) STOP – 停止执行程序
3.2.5 实验操作步骤
1) 参考前面实验创建新的工程(工程名为C1);
2) 按照参考程序,编写源文件C1.c和C1.cs,并把它们加入工程里面。C1.cs加在工程根目录即可。
3) 参考前面例子进行标准的设置,其中需要注意的是,在调试Debug对话框设置的时候,增加连接后自动执行脚本文件:
图3-10 Embest IDE调试配置
4) 参考前面实验步骤进行编译;
33
5) 下载,打开Memory/Register/Watch/Variable窗口,单步执行,通过
memory/register/watch/variable窗口分析判断结果,在watch框中输入要观察变量I和变量J的值,并记录下来。特别注意在variable窗口观察变量I的变化并记录下来; 6) 结合实验内容和相关资料,观察程序运行,通过实验; 7) 理解和掌握实验后,完成实验练习题。
3.2.6 实验参考程序
1. c1.c参考源代码:
/********************************************************************************************* * File:
c1.c
* Author: embest * History:
*********************************************************************************************/
/*----------------------------------------------------------------------------------------------------------*/ /*
function declare
*/
/*----------------------------------------------------------------------------------------------------------*/ void delay(int nTime);
/********************************************************************************************* * name: * func: * para: * ret: * modify: * comment: _start() { }
/*********************************************************************************************
34
for( ; ; ) delay(i); { }
int i = 5;
*********************************************************************************************/
_start
entry point none none
* Desc: c language example 1
* name: * func: * para: * ret: * modify:
delay
delay some time nTime -- input none
* comment:
*********************************************************************************************/ void delay(nTime) {
int i, j = 0; }
for(i = 0; i < nTime; i++) for(j = 0; j < 10; j++) { } }
{
2. C1.cs参考源代码
stop ; stop target board
regwrite sp 0x1000 ; initialize the sp , sp = 0x1000
3.2.7 练习题
参考汇编实验,编写程序,实现从汇编语言中使用B或BL命令跳转到C语言程序的Main()
函数中执行,并从Main()函数中调用delay()函数;调试时使用common目录下ev40boot.cs命令脚本文件,观察该命令脚本文件所完成的存储单元配置的情况。
35