## ARM基础编程实验

article/2025/11/5 16:08:42

在这里插入图片描述

ARM基础编程实验

作者: Saint
掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a
微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1
GitHub:github.com/saint-000
CSDN: https://me.csdn.net/qq_40531974

一、实验目的
1.熟悉并掌握常用ARM汇编指令
2.熟悉并掌握“C+汇编”混合编程技术
3.熟练使用ARM软件开发调试工具Keil

二、实验内容
1.学习使用Keil开发工具。
2.使用ARM汇编语言,编程实现1+2+……+N累加运算功能。
3.使用C调用汇编函数,实现字符串拷贝功能。
4.使用汇编调用C函数,实现求和运算功能。
5.使用ARM汇编语言,实现冒泡排序算法。

三、实验步骤
实验1.1:运行Keil,建立工程文件,单步运行调试演示示例程序,深刻理解每一条指令,观察寄存器,内存空间的变化。ARM数据处理指令寻址方式实验和ARM内存访问指令寻址方式实验,ARM堆栈指针寄存器实验、ARM程序计数器实验、ARM程序状态寄存器实验、ARM工作模式切换实验。

实验1.2:用ARM汇编实现1+2+…+N的累加运算
1.将实验1.2文件夹中的sum.s文件添加至工程中。
2.在文件中,用汇编实现算法核心部分,需添加的代码参考流程图如下:
在这里插入图片描述
3. 运行Debug进行调试。

实验1.3:理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。
1.将实验1.3文件夹中的testfile.s和main.c文件添加至工程中。
2.在汇编文件testfile.s中添加两行汇编代码,分别实现:
(1) 拷贝源字符串的一个字节到R2中;
(2) 将拷贝的字节复制到目标空间。
(3)运行Debug进行调试。

实验1.4:在汇编中调用C函数。
1.将实验1.4文件夹中的sum.c和testfile.s文件添加至工程中。
2.在汇编文件testfile.s中相应位置添加汇编代码,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。
3.运行Debug进行调试,观察实验现象。

实验1.5:用ARM汇编实现冒泡算法。
1.将实验1.5文件夹中的maopao.s文件添加至工程中。
2.在汇编文件maopao.s中相应位置添加汇编代码,实现冒泡排序。
3.运行Debug进行调试。
4.在debug界面,点击Debug →Memory Map,修改地址分段属性。
5.观察实验现象

四、实验结果
实验1.1ARM数据处理指令寻址方式实验和ARM内存访问指令寻址方式实验中代码如下:
在这里插入图片描述

在这里插入图片描述
通过调试可以发现知道代码中的数据传送指令MOV;算术运算指令-加法指令ADD和减法指令SUB;以及比较指令CMP等数据处理指令在寄存器的数值和地址的变化,初步了解ARM的寻址方式以及数据传送方式。

实验1.2编程实现1+2+…+N 代码书写:

 ;功能:计算1+2+3+4+...+N;说明;N>=0,当N=0时结果为0,当N=1时结果为1N EQU 100   ;定义N的值100AREA Examples,CODE,READONLY   ;声明代码断Examples3ENTRY   ;标识程序入口 CODE32
ARM_CODE
LDR SP,=0X30003F00    ;设置堆栈指针ADR R0,THUMB_CODE+1    BX R0        ;跳转并切换处理器状态LTORG        ;声明文字池	
CODE16
THUMB_CODE
LDR R0,=N    ;设置子程序SUM_N的入口参数 BL SUM_N     ;调用子程序SUM_NB THUMB_CODE ;SUM_N
;功能:计算1+2+3+......+N
;入口参数:R0 N的值
;出口参数:R0 运行结果 
;占用资源:R0
;说明:当N=0时结果为0,当N=1时结果为1
;若运算溢出,结果为0
SUM_NPUSH {R1-R7,LR}  ;寄存器入栈保护MOVS R2,R0       ;将n的值复制到R2,并影响相应条件标志BEQ SUM_END      ;若N=0,则返回,成立即返回CMP R2,#1		 ;比较R2是否为1BEQ SUM_END      ;若N=1,则返回,成立即返回MOV R1,#1        ;初始化计数器R1=1									MOV R0,#0        ;初始化计数器R0=0 
SUN_L1ADD R0,R1		 ;R0=R1+R0BVS SUM_END		 ;溢出	CMP R1,R2		 ;比较R1和n是否相等BVS SUM_END		 ;相等,跳出循环,即加到n结束ADD R1,#1		 ;R1=R1+1;B SUN_L1		 ;跳转循环
SUM_ERRMOV R0,#0		;R0=0
SUM_END MOV R8,R0		 ;将结果保存在R8中POP {R1-R7,PC}   ;寄存器出栈,返回END

实验结果:
最终寄存器R8的读数为为0X000013BA,数值为十进制的5050,正好是从1加至100之和,所以成功实现该功能。

实验1.3理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。
在C程序中调用该汇编程序

;文件名:main.c
;功能:完成字符串的拷贝
#include <stdio.h>
extern void strcopy(char *d ,char *s);
int main(void)
{char *srcstr = "aaaa";char dststr[] = "bbbb";//printf("Before copying:\n");				//仿真调试时禁用printf语句//printf(" %s %s\n",srcstr,dststr);strcopy(dststr,srcstr);//printf("After copying: \n");//printf(" %s\n  %s\n",srcstr,dststr);return (0);};文件名:TEST.S 
;功能:从C语言中调用汇编语言
AREA	Example1,CODE,READONLY	;声明代码段Example1 
CODE32				   ;声明32位ARM指令
IMPORT __main
EXPORT strcopy
strcopy	LDRB  R2,[R1],#1	;拷贝源字符串的一个字节STRB  R2,[R0],#1	;将拷贝的字节复制到目标空间,CMP   R2,#0		;比较R2=0BNE   strcopy	MOV   PC,LREND			     	  

实验结果:
将原来的aaaa bbbb的值变成了aaaa aaaa,所以成功实现字符串复制。
在这里插入图片描述在这里插入图片描述

实验1.4在汇编中调用C函数

;文件名:main.c
;功能:完成求和
int g(int a, int b ,int c,int d)
{return a+b+c+d;
};文件名:TESTFILE.S 
;功能:从汇编语言中调用C语言IMPORT g
AREA	Example1,CODE,READONLY	  	CODE32				  	ENTRY
START	MOV		R0,#1	MOV		R1,#2MOV		R2,#3MOV		R3,#10BL		gMOV		R8,R0	B		STARTEND

实验结果:
最终寄存器R8读数为0X000010,正好为1+2+3+10=16,所以正确实现该功能。

实验1.5用ARM汇编实现冒泡算法。

 AREA Sort,CODE,READONLYENTRY
startMOV r4,#0LDR r6,=srcADD r6,r6,#len
outerLDR r1,=src
innerLDR r2,[r1]LDR r3,[r1,#4]CMP r2,r3STRGT r3,[r1]STRGT r2,[r1,#4]ADD r1,r1,#4CMP r1,r6BLT innerADD r4,r4,#4CMP r4,#lenSUBLE r6,r6,#2BLE outer
src DCD 2,4,10,8,14,1,20AREA Array,DATA,READWRITE
len EQU 7*4
END

实验结果:
从起始寄存器位置开始,每个四个输出一个数据,数据依次为1,2,4,8,10,14,20,由此完成了冒泡排序法。
在这里插入图片描述
五、实验总结
1、学习使用Keil开发工具。
2、完成了1+2+…+N求和,N=100时答案为5050。
3、C语言中调用了汇编语言,实现字符串复制。
4、汇编中调用了C语言函数,实现了实现求和运算功能。
5、用汇编语言实现了冒泡排序法,结果为1,2,4,8,10,14,20。

实验心得:
(1)在写冒泡排序过程中发现,如果使用杂项伪命令AREA定义数据段时, AREA Sort,CODE,READONLY这段代码要缩进,以及跟下面结束时的相同代码对齐,否则会出现编译错误。
在这里插入图片描述

(2)我们在使用memory map的时候,需要查看同一个寄存器的首地址和尾地址的数据变化,我们需要将程序刚开始的寄存器首地址和结束时的尾地址填入memory map中,注意格式如下:
在这里插入图片描述
在这里插入图片描述

六、实验思考题
1.ADD替换成ADDS,SUB替换成SUBS有什么影响?
运算结果不影响CPSR中相应标志位的值,跳转指令因为上一步的CPSR的值没有改变而无法正确执行。S用于决定指令的操作是否影响CPSR中的条件标志位。

2.MOV替换成MOVNE有什么影响?
只有在上一步计算结果为不相等时才执行。MOVNE先判断条件NE (不相等)则转移,可以看作是两条指令NE=NOT EQUAL不相等。

3.STMIA换成STMIB,STMIA换成STMDA有什么区别?
STMIA换成STMIB是将每次写入前地址+4改为地址-4,STMIA换成STMDA是将每次写入前地址+4改为+1 ,其中STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);

STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);STMDA(完成操作而后地址递减)、STMED(空递减堆栈)。

4.思考用ARM汇编实现1+3+5+…+(2n+1)或者2+4+6+…+2n。
实现1+3+5+„.+(2n+1):

将 add r1,r1,#1 改为 add r1,r1,lsl  #1       sub r1,r1,#1   
实现2+4+6+…..+2n:   
将 add r1,r1,#1 改为 add r1,r1,lsl  #1  

5.实验3中如果去除汇编代码中的“EXPORT strcopy”会有什么现象,为什么?
C语言无法调用用strcopy函数。因为EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。

6.实验4中如果去除汇编代码中的“IMPORT ……”会有什么现象,为什么?
在这里插入图片描述
把“IMPORT ….注释后发现,编译调试时程序单步运行直接从汇编程序开始,说明无法调用C语言的main函数。IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。


http://chatgpt.dhexx.cn/article/N8NMi51s.shtml

相关文章

ARM汇编编程基础

(一) -- ARM CPU寄存器 本系列文章节选自本人所著《深入浅出嵌入式底层软件开发》。 本系列文章&#xff0c;所需代码请从以下地址下载: http://download.csdn.net/download/scyangzhu/4602585 ARM的汇编编程&#xff0c;本质上就是针对&#xff23;&#xff30;&#…

搭建Keil编程环境,ARM汇编语言编程入门实践

多看多学 一、安装及配置环境01 型号分类及缩写02 资料共享03 安装器件支持包04 Keil简单设置 二、简单程序编译01 新建工程02 配置环境03 添加源文件04 设置仿真器模式05 编译调试06 分析Hex文件 三、中值滤波及程序设计01 中值滤波02 流程框图03 程序设计 四、总结参考资料 一…

ARM编程环境搭建教程

随着移动互联网的繁荣发展&#xff0c;物联网人工智能的兴起&#xff0c;嵌入式开发成为了越来越多IT人必须学习的内容&#xff0c;而在嵌入式芯片领域&#xff0c;ARM具有无可撼动的市场占有率&#xff0c;所以说&#xff0c;学习嵌入式不学ARM&#xff0c;不如回家卖红薯。 接…

嵌入式ARM设计编程(四) ARM启动过程控制

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 &#xff08;1&#xff09; 掌握建立基本完整的ARM 工程&#xff0c;包含启动代码&#xff0c;C语言程序等&…

《嵌入式基础》实验三 ARM编程模型和ARM指令

零、前言 本人不擅长写汇编相关的东西&#xff0c;所以以下内容也是不断摸索&#xff08;百度 &#xff09; 整出来的&#xff0c;和linux的实验报告的质量相比较低。 一、 实验目的 掌握ARM微处理器的汇编指令的使用方法。掌握使用 LDM/STM&#xff0c;B&#xff0c;BL 等指…

嵌入式ARM设计编程(一) 简单数据搬移

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 熟悉实验开发环境&#xff0c;掌握简单ARM汇编指令的使用方法。 二、实验环境 硬件&#xff1a;PC机 软件&am…

ARM汇编语言编程入门实践

文章目录 一、keil的安装二、安装stm32 pack三、keil 的简单设置四、基于STM32汇编程序的编写4.1 新建工程4.2 新建test.s文件4.3 编译程序4.4 分析HEX文件 五、总结六、参考资料 一、keil的安装 双击打开mdk_510.exe应用程序文件&#xff0c;点击Next>>。勾选I agree……

ARM体系结构与编程模型总结

ARM体系结构与编程模型 ARM体系结构 一、ARM处理器简介及RISC特点 ARM处理器简介 ARM&#xff08;Advanced RISC Machines&#xff09;是一个32位RISC&#xff08;精简指令集&#xff09;处理器架构&#xff0c;ARM处理器则是ARM架构下的微处理器。ARM处理器广泛的使用在许多…

数学建模-层次分析法(评价模型)

层次分析法概述 层次分析法的步骤和方法 1. 建立层次结构模型 2. 构造判断(成对比较)矩阵 3. 层次单排序及其一致性检验 4. 层次总排序及其一致性检验 总结 应用层次分析法的注意事项 举例 层次分析法代码实现 disp(输入判断矩阵C) Cinput(C); %输入矩阵 [n,n] size(C);%…

数学建模-层次分析模型

层次分析法的基本原理与步骤 人们在进行社会的、经济的以及科学管理领域问题的系统分析中&#xff0c;面临的常常是一个由相互关联、相互制约的众多因素构成的复杂而往往缺少定量数据的系统。层次分析法为这类问题的决策和排序提供了一种新的、简洁而实用的建模方法。 运用层次…

数学建模-层次分析法

个人主页&#xff1a; 个人主页 系列专栏&#xff1a; 数学建模 目录 前言 一、引入 二、层析分析法 1.思想介绍 2.判断矩阵 3.一致矩阵 4.一致性检验 5.一致性检验步骤&#xff08;两张图片告诉你&#xff09; 6.计算权重 一致矩阵计算权重&#xff1a; 判断矩阵计…

数学建模--层次分析法

层次分析法的求解步骤 1.建立层次结构模型 模型分为三层。分别为最高层&#xff08;决策问题最终要解决什么&#xff0c;即决策的目的&#xff09;、中间层&#xff08;考虑的因素&#xff0c;决策的准则。比如买衣服要考虑价格、尺寸、款式等因素&#xff09;和最低层&#…

层次分析法模型(数学建模学习)

本系列参考清风老师的数学建模课程 层次分析法模型 一、模型介绍 &#xff08;一&#xff09;模型引入 对于方案选择类问题&#xff0c;评价类问题采用层次分析法&#xff08;The ayalytic hierarchy process / AHP&#xff09;模型进行评分&#xff0c;之后评分高的就是最佳…

数据库常用数据模型1(层次模型)

1 数据模型分为两类&#xff1a;一类是概念模型&#xff08;信息模型&#xff09;&#xff0c;第二类是逻辑模型&#xff08;数据建模&#xff09;和物理模型&#xff08;对数据最底层的抽象&#xff09;。 2 常用的逻辑模型&#xff1a;层次模型、网状模型、关系模型、面向对…

计算机网络层次模型

计算机网络层次模型 OSI 7层协议 物理层&#xff1a;在局部局域网上传送数据帧&#xff08;Data Frame&#xff09;&#xff0c;它负责管理电脑通信设备和网络媒体之间的互通。数据链路层&#xff1a;在两个网络实体之间提供数据链路连接的创建、维持和释放管理。构成数据链路…

批判马斯洛需求层次模型

再次批判马斯洛需求层次模型&#xff0c;有啥缺陷&#xff1f; 趣讲大白话&#xff1a;文化不同&#xff0c;心理不同 【趣讲信息科技182期】 **************************** 每个民族的文化心理结构都不一样 常常低估文化对人的影响 有一门心理学分支&#xff0c;文化心理学 专…

网络层次模型及各层对应协议

一、OSI七层模型 OSI七层协议模型主要是&#xff1a;应用层&#xff08;Application&#xff09;、表示层&#xff08;Presentation&#xff09;、会话层&#xff08;Session&#xff09;、传输层&#xff08;Transport&#xff09;、网络层&#xff08;Network&#xff09;、数…

层次分析法模型

层次分析法 文章目录 层次分析法概述层次分析法简介层次分析法典型应用层次分析法基本原理 层次分析法的步骤和方法建立层次结构模型构造判断矩&#xff08;成对比较&#xff09;阵层次单排序及其一致性检验一致性检验正互反阵最大特征根和特征向量的简化计算 层次总排序及其一…

层次分析法模型讲解

一、解决评价类问题 二、资料来源 三、例题 1.准备 2.权重表格 3.分而治之解决权重弊端 4.层次分析法 根据判断矩阵求权重&#xff0c;下面对各个指标进行填写判断矩阵&#xff1a; bug分析&#xff1a; 如果小明填写的不是5而是1&#xff0c;这里发现&#xff1a;苏杭>北戴…

数学建模之层次分析法模型

目录 问题 问题实例 问题分析 建立层次分析法模型 分析权重的方法 ​编辑 填表指标的权重​编辑 一致性检验 一致性检验的引入 一致性检验的步骤 计算判断矩阵 归一化处理 算术平均法求权重 几何平均法求权重 特征值法求权重&#xff08;常用&#xff09; 汇总结果…