ARM实验报告
姓名:郭健傧学号:L2101898
1.实验目的
(1)了解ADS1.2集成开发环境及ARMulator软件仿真;
(2)熟悉ARM的乘法指令和逻辑指令;
(3)结合ARM处理器硬件特性,比较处理函数的特性;
2.实验设备
硬件:pc机一台;
软件:Windowsxp系统,ADS1.2集成开发环境;
3.实验内容
(1)建立一个新的工程;
(2)建立一个汇编文件,并添加到工程;
(3)根据所给的两个C语言函数编写相应的汇编程序,并比较一下代码中fact1和fact2两个函数的特性;
4.实验步骤
(1)启动ADS1.2IDE集成开发环境,使用ARM Executable Image 工程模块建立一个工程heiye。
(2)建立汇编源文件test.s,编写程序实验,并添加到工程heiye中。
(3)设置工程连接地址Ro Base为0x40000000,RWBase为0x40003000。
设置调试入口地址Image entry point为0x40000000。
(4)编译链接工程,并启动AXD进行软件仿真调试。
5.编写程序如下:
C程序源代码:
int fact1(int limit)
{ int fact=1;
for(i=1;i<limit;i++)
fact*=i;
return fact;}
int fact2(int limit)
{int fact=1;
for(i=limit;i!=0;i--)
fact*=i;
return fact;}
(1)编写相应的汇编代码1:
;n!arithmetic
AREA heiye1,CODE,READONLY
CODE32
ENTRY
Main
LDR R0,limit ;装载limit
LDR R1,fact ;装载fact
MOV R2,R1 ;把r2设置为1
BL CYCLE ;调用循环程序
STR R1,result ;将结果存储到内存
MOV R0,#0x18 ;执行中止
SWI 0x123456
CYCLE
MUL R3,R1,R2
MOV R1,R3
ADD R2,R2,#1
CMP R0,R2 ;比较R0和R2的大小并修改状态位
BNE CYCLE
MOV PC,LR
AREA NUM,DATA,READWRITE ;定义数据段
fact DCD 1
limit DCD 0x0000000A
result DCD 0
END
(2)编写相应的汇编程序2:
;n!arithmetic
AREA heiye2,CODE,READONLY
CODE32
ENTRY
Main
LDR R0,limit ;装载limit
LDR R1,fact ;装载fact
BL CYCLE ;调用循环程序
STR R1,result ;将结果存储到内存
MOV R0,#0x18 ;执行中止
SWI 0x123456
CYCLE
MUL R3,R1,R0
MOV R1,R3
SUBS R0,R0,#1
BNE CYCLE ;判断R0是否为零
MOV PC,LR
AREA NUM,DATA,READWRITE ;定义数据段
fact DCD 1
limit DCD 0x0000000A
result DCD 0
END
6.程序中出现的问题
(1)刚开始时,由于马虎把result也写成了resule,导致(STR R1,result)时提示出错,经过仔细查看才发现。
程序入口ENTRY和程序结束END前没按Tab
键,编译时提示没有程序入口,这些地方要特别注意!
(2)仔细比较两个程序的运行结果会发现,第一个汇编程序运算的是(limit-1)!,第二个汇编程序运算的是(limit)!。
但当limit的取值较大时,结果溢出,暂时未能解决!请老师给予指导!
7.程序演示过程
可以单步运行程序,可以设置/取消断点,或者全程运行程序,停止运行程序,调试观看寄存器和0x40000000地址上的值,运行结果如下:
(程序1的单步运行演示)
(程序1的全程运行结果)
(程序2的单步运行演示)(程序2的全程运行结果)。