实验三:C语言程序实验和C语言调用汇编程序实验
一、 实验目的
通过实验了解使用 ADS 1.2 编写 C 语言程序,并进行调试。
二、实验设备
硬件:PC 机一台
软件:Windows98/XP/2000 系统,ADS 1.2 集成开发环境
三、实验内容
编写一个汇编程序文件和一个 C 程序文件。汇编程序的功能是初始化堆栈指针和初始化 C 程序的运行环境,然后调跳转到 C 程序运行,这就是一个简单的起动程序。C 程序使用加法运算来计算 1+2+3+...+(N-1)+N 的值(N>0)。
四、实验预习要求
仔细阅读教材中的ARM 指令系统的内容;
熟悉ADS 工程编辑和 AXD 调试的内容。(本实验使用软件仿真)
五、实验步骤
1. 启动 ADS 1.2,使用 ARM Executable Image 工程模板建立一个工程 ProgramC。
2. 建立源文件 Startup.S 和 Test.c,编写实验程序,然后添加到工程中。
3. 设置工程连接地址 RO Base 为 0x40000000,RW Base 为 0x40003000。设置调试入口地址 Image entry point 为 0x40000000。
4. 设置位于开始位置的起始代码段,如图 3.8所示。
图 3.8 设置位于开始位置的起始代码段
5. 编译连接工程,选择【Project】->【Debug】,启动 AXD 进行软件仿真调试。
6. 在 Startup.S 的“B Main”处设置断点,然后全速动行程序。
7. 程序在断点处停止。单步运行程序,判断程序是否跳转到 C 程序中运行。
8. 选择【Processor Views】->【Variables】)打开变量观察窗口,观察全局变量的值,
单步/全速运行程序,判断程序的运算结果是否正确。
六、 实验参考程序
C 语言实验的参考程序见程序清单 3.3。汇编起动代码见程序清单 3.4。
程序清单 3.3 C 语言实验参考程序
#define uint8 unsigned char
#define uint32 unsigned int
#define N 100
uint32 sum;
// 使用加法运算来计算 1+2+3+...+(N-1)+N 的值。(N>0)
void Main(void)
{ uint32 i;
sum = 0;
for(i=0; i<=N; i++)
{ sum += i;
}
while(1);
}
程序清单 3.4 简单的起动代码
; 起动文件。初始化 C 程序的运行环境,然后进入 C 程序代码。
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT Main ; 声明 C 程序中的 Main()函数
AREA Start,CODE,READONLY ; 声明代码段 Start
ENTRY ; 标识程序入口
CODE32 ; 声明 32 位 ARM 指令
Reset LDR SP,=0x40003F00 ; 初始化 C 程序的运行环境
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
CMP R0,R1
BEQ LOOP1
LOOP0 CMP R1,R3
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
BCC LOOP0
LOOP1 LDR R1,=|Image$$ZI$$Limit|
MOV R2,#0
LOOP2 CMP R3,R1
STRCC R2,[R3],#4
BCC
LOOP2 B Main ; 跳转到 C 程序代码 Main()函数
END
七、思考题
在实验参考程序中,Startup.S 文件的作用是什么?如果没有 Startup.S 文件,C 程序会运行出错吗?
实验程序中的 Main()函数名是否可以更改为其它名字?(提示:Main 只是一个标号)
展开阅读全文