ARM汇编指令实验
题目
地址为0x40008000起始的内存中存放了20个无符号的8位整数,请编写ARM汇编程序实现如下功能:
采用冒泡法将以上内存中的数据按照从小到大的顺序排列。
注意:在验收实验时,需要自己把具体的数据存放在对应地址的内存中,然后对数据排序,最后通过ADS软件的Memory查看最终的排序结果。
代码编写思路
1.使用EQU将标签指向特定地址
2.使用DCB设定一系列的八位数据
(DCW是设定16位数据,DCD是设定32位数据)
3.将数据存放在0x40008000的起始地址:
初始化:①R1加载待保存地址
②R2加载数据地址
③计数器R0置0
开始循环DATA_LOAD:
①使用LDRB将R2所指地址的值,移向R3寄存器,并将R2自增指向下一位数据
②使用STRB将R3寄存器的值保存在R1所指地址中,R1自增。
③计数器R0自增。
④比较R0与19的大小,如果小于则跳转至DATA_LOAD继续循环。
4.冒泡排序
①初始化计数器
②同存放数据一至,遍历20次,在每次遍历中对20个数据进行比较,置换。
部分指令的解释:
STRB/LDRB:以8位存/取数据
BLS:B跳转,LS条件判断,CMP比较后,小于则执行跳转
STRLSB:CMP比较后,小于则以8位存数据
BNE:CMP比较后,不等于则跳转
MOV:将源操作数放入目的操作数
LDR:将数据读入寄存器
汇编语言代码
DATA_ADDR EQU 0x40008000 ;使用EQU将标签指向特定地址
AREA Exp1,CODE,READONLY ;声明代码段Exp1
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令
START MOV R0,#0 ; R0, 数据加载时间计数器
LDR R1,=DATA_ADDR ; 加载地址0x40008000
LDR R2,=DATA ; R2存放数据
B DATA_LOAD ; 跳转到DATA_LOAD程序存放数据
DATA DCB 100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
DATA_LOAD LDRB R3,[R2],#1 ; R3存放数据
STRB R3,[R1],#1 ; 将数据依次存放到内存中
ADD R0,R0,#1 ; R0充当计数器,每存放一个数据,加一
CMP R0,#19 ; 循环19次直到存放完所有的数据
BLS DATA_LOAD ; 如果没存放完则重新跳转,直到数据存放完毕
MOV R0,#0 ; 清零计数器R0
LOOP_1 ; 开始冒泡排序,外层循环
LDR R1,=DATA_ADDR ; R1, 加载数据地址
ADD R2,R1,#1 ; R2为存放下一位数据地址
MOV R5,#0 ; R5内存循环计数器
LOOP_2
LDRB R3,[R1] ; R3存放第一个数
LDRB R4,[R2] ; R4存放第二个数
CMP R4,R3 ; 比较R3和R4,如果R4(右边的数)小于R3(左边的数),则执行交换
STRLSB R3,[R2] ; 交换R1与R2的数
STRLSB R4,[R1] ; 交换数据
ADD R1,R1,#1 ; R1地址加1,开始比较下一位
ADD R2,R2,#1 ; R2地址加1,开始比较下一位
ADD R5,R5,#1 ; 计数器加1
CMP R5,#19 ; 循环19次后退出
BNE LOOP_2 ; 未完成循环,继续执行内循环
ADD R0,R0,#1 ; 计数器加1
CMP R0,#19 ; 比较外循环计数器有没有达到19次
BNE LOOP_1 ; 未完成19次循环,继续执行外循环
MOV R1,#6 ; 排序完成标志,当排序完成时给R1赋值6(可删去这一步)
END
运行结果
1.存放数据,排序前:

2.排序后

扩展-如何从大到小排序?
将图中标红部分的R3和R4位置交换,则可以实现数据从大到小的排序。

实验结论及分析
此次实验的冒泡排序采用了嵌套循环,将数组中左右的数进行比较,如果左边的数大于右边的数则进行交换。如果要从大到小排序,则与之相反,右边的数大于左边的数就进行交换,因此,在源程序中只改变一步即可实现数据的从大到小排序。
ARM汇编指令实验的更多相关文章
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM汇编指令(未完待续)
ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...
- ARM汇编指令的一些总结-转
ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...
- ARM 汇编指令
ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- GNU ARM 汇编指令
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...
- ARM汇编指令特点
根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...
- arm汇编指令
ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...
随机推荐
- WPF 入门笔记 - 07 - MVVM示例
滴咚,大家好久不见.好就没写东西了,鸽着鸽着就无了... 回到正题,上篇文章说完命令提了一嘴MVVM模式直接就上MVVMLight这些程序的框架了,虽然也没说多少,但还是有点不好过渡,这篇对MVVM做 ...
- ZS Shuffles Cards 题解
ZS Shuffles Cards 题解 我们把每一次抽一些数字牌再抽到 joker 视作一局游戏. 每局期望轮数 首先考虑 \(f_i\) 表示每一局游戏抽出 \(i\) 张牌的概率. 那么就是先抽 ...
- 这才叫 API 接口设计!
API 接口设计 Token 设计 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上 ...
- MindSponge分子动力学模拟——Constraint约束
技术背景 在前面的几篇博客中,我们已经介绍了MindSponge的基本使用方法,比如定义一个分子系统.计算分子的单点能以及迭代器的使用等.有了这些基础的教程,用户以及可以执行一些比较简单的模拟任务,比 ...
- HDFS核心概念与架构
HDFS简介 HDFS是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理,它基于流数据模式访问和处理超大文件的需求而开发,可以运行在廉价的商用服务器上,为海量数据提供 ...
- windows10 jdk下载及环境配置
一.环境准备 windows10 系统 jdk 各种版本(配置大同小异) 二.下载并安装jdk 下载地址:http://www.oracle.com/technetwork/java/javase/ ...
- 主动写入流对@ResponseBody注解的影响
问题回溯 2023年Q2某日运营反馈一个问题,商品系统商家中心某批量工具模板无法下载,导致功能无法使用(因为模板是动态变化的) 商家中心报错(JSON串): {"code":-1, ...
- 【RocketMQ】顺序消息实现总结
全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...
- mpi转以太网连接300PLC与施耐德 Quantum PLC 通讯
S7300 PLC转以太网无需编程与施耐德 Quantum PLC modbusTCP通信 方案介绍: 西门子300PLC转以太网不需要编写程序通过兴达易控MPI-ETH-XD1.0与施耐德 Quan ...
- vue2实现饼图Pie组件封装
实现如下效果: 效果展示:https://code.juejin.cn/pen/7226656439941955644 如果不会请移步到官网的栗子,请点击查看 直接给大家上代码: 整体代码片段 1 & ...