微处理器系统结构与嵌入式系统设计实验报告
微处理器系统结构与嵌入式系统设计实验名称 ARM基础编程实验
一、实验目的
1.熟悉并掌握常用ARM汇编指令
2.熟悉并掌握“C+汇编”混合编程技术
3.熟练使用ARM软件开发调试工具Keil
二、实验内容
1.学习使用Keil开发工具
2.使用ARM汇编语言,编程实现1+2+……+N累加运算功能
3.使用C调用汇编函数,实现字符串拷贝功能
4.使用汇编调用C函数,实现求和运算功能
5.使用ARM汇编语言,实现冒泡排序算法(选做)
三、实验步骤
1.实验1.1:运行Keil,建立工程文件,单步运行调试演示
示例程序,深刻理解每一条指令,观察寄存器,内存空间
的变化。
2.实验1.2:用汇编语言实现1+2+...+N的累加:
a)建立新工程,加入实验1.2文件夹中的sum.s。
b)用汇编补充算法核心部分,代码参考流程图如下
图1.1所示。
c)使用单步调试,仔细观察过程中关键寄存器值的
变化。
微处理器系统结构与嵌入式系统设计实验报告
RO=R0+R1
R1=R1+1
SUM_END
结果溢出?
R1>=N
NO
YES
YES
NO
图1.1
3. 实验1.3:C 调用汇编实现字符串拷贝功能:
a) 建立新工程,加入实验1.3文件夹中的main.c 和testfile.s(同一个工程下添加两个文件一起编译)。
b) 补充完成源代码中缺失的部分,分别实现
1. 拷贝源字符串的一个字节到R2中;
2. 将拷贝的字节复制到目标空间。
c) 运行Debug 进行调试。
4. 实验1.4:汇编调用C 实现求和1+2+ (10)
a) 建立新工程,加入实验1.4文件夹中的sum.c 和testfile.s(同一个工程下添加两个文件一起编译)。
b) 补充完成源代码中缺失的部分,通过调用c 函数g()实现1+2+3+glovb1,结果存在R8中。
c) 运行Debug 进行调试
5. 实验1.5:ARM 汇编实现冒泡算法:
a) 建立新工程,加入实验1.5文件夹中的maopao.s 。
b) 补充完成源代码中缺失的部分,实现冒泡排序功能。
c) 运行Debug 进行调试
四、 实验结果
1. 实验1.2:用汇编语言实现1+2+...+N 的累加
R1自增1
R0暂存累加和
微处理器系统结构与嵌入式系统设计实验报告
核心代码如下:
ADD R0,R1
BVS SUM_END
CMP R1,R2
BHS SUM_END
ADD R1,#1
B SUN_L1
图1.2
可以看见最终结果显示在寄存器R8处,十六进制为13BA,转换成十进制为5050,实现了累加功能。
2.实验1.3:C调用汇编实现字符串拷贝功能
核心代码如下:
LDRB R2,[R1],#1 ;拷贝源字符串的一个字节STRB R2,[R0],#1 ;将拷贝的字节复制到目标空间
可以看出拷贝前srcstr是aaaa,dststr是bbbb,拷贝后srcstr是aaaa,dststr是aaaa,实现了字符串拷贝功能。
3.实验1.4:汇编调用C实现求和1+2+...+10
图1.3 前图1.4 后
微处理器系统结构与嵌入式系统设计实验报告
核心代码如下:
MOV R0,#1
MOV R1,#2
MOV R2,#3
MOV R3,#10
BL g
MOV R8,R0
图1.5
可以看出最终结果显示在寄存器R8处,十六进制表示为0010,转换为十进制为16
4.实验1.5:ARM汇编实现冒泡算法
代码如下:
AREA Sort,CODE,READONLY
ENTRY
start
MOV R4,#0
LDR R6,=src
ADD R6,R6,#len
LDR R7,=src
微处理器系统结构与嵌入式系统设计实验报告
inner
MOV R1,R7
CMP R6,R7
BLE outer
inner1
LDR R2,[R1]
LDR R3,[R1,#4]
CMP R2,R3
BGT exchange
inner2
ADD R1,R1,#4
CMP R1,R6
BLT inner1
ADD R4,R4,#4
CMP R4,#len
BLE subtraction
exchange
STR R3,[R1]
STR R2,[R1,#4]
B inner2
subtraction
SUB R6,R6,#4
B inner
outer
LDR R1,=src
src DCD 2,4,10,8,14,1,20
AREA Array,DATA,READWRITE
len EQU 7*4
微处理器系统结构与嵌入式系统设计实验报告
END
图1.6 排序前
图1.7 排序后
可以看见地址0x0000005C保存的排序后的结果正确,程序
实现了冒泡法排序功能。
(注:命令行键入指令“map 0,4095 read write
exec”,解决实验用芯片S3C2440内存访问权限错误问
题。
)
五、实验总结
1.此次实验用汇编和C语言实现了1~N的累加、字符串的拷
贝、数字求和以及冒泡法排序这几项功能,了解了汇编语
言的基础指令及其意义,同时初步入门了Keil编译器的使
用与程序编写调试。
2.知道了C程序与汇编语言相互调用的规则:
a)寄存器的使用规则:“子程序间”通过寄存器R0~R3来
传递参数。
在“子程序中”,使用寄存器R4~R11来保
存局部变量。
b)寄存器R12用于子程序间scratch寄存器(用于保存
SP,在函数返回时使用该寄存器出桟),记作IP。
c)寄存器R13用于数据栈指针,记作SP。
寄存器SP在进
入子程序时的值和退出子程序时的值必须相等。
d)寄存器R14称为链接寄存器,记作LR。
它用于保存子程
序的返回地址。
e)寄存器R15是程序计数器,记作PC。
微处理器系统结构与嵌入式系统设计实验报告
六、实验思考题
1.Q:ADD替换成ADDS,SUB替换成SUBS有什么影响?
A:替换后,运算结果会影响标志寄存器。
因为ADD、SUB
不带进位与借位,ADDS、SUBS带有进位与借位,运算完成
要置符号位。
2.Q:MOV替换成MOVNE有什么影响?
A:替换后只有在上一步比较结果为不相等的时候才会执行
该指令。
3.Q:STMIA换成STMIB,STMIA换成STMDA有什么区别?
A:换成STMIB是将每次传送后地址+4变成每次传送前地
址+4,换成STMDA是将每次传送后地址+4变成每次传送
后地址-4。
4.Q:思考用ARM汇编实现1+3+5+…+(2n+1)或者2+4+6+…
+2n。
A:实现1+3+5+….+(2n+1),将ADD R1,#1改为ADD R1,#2,
设置R1初始值为1。
实现2+4+6+…..+2n,将ADD R1,#1改为ADD R1,#2,设置R1初始值为2.
5.Q:实验3中如果去除汇编代码中的“EXPORT strcopy”会
有什么现象,为什么?
A:若去除汇编代码中的“EXPORT strcopy”,则在c语言
中无法调用该函数,因为EXPORT用于声明strcopy为全局
标号。
6.Q:实验4中如果去除汇编代码中的“IMPORT …..”会有
什么现象,为什么?
A:会无法调用C语言的main函数,因为该伪指令用于通
知编译器要使用的标号或者变量在其他的源文件定义。