题目

地址为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汇编指令实验的更多相关文章

  1. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  2. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  3. ARM汇编指令(未完待续)

    ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...

  4. ARM汇编指令的一些总结-转

    ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...

  5. ARM 汇编指令

    ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...

  6. 经常使用ARM汇编指令

    一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...

  7. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  8. GNU ARM 汇编指令

    第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...

  9. ARM汇编指令特点

    根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...

  10. arm汇编指令

    ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...

随机推荐

  1. WPF 入门笔记 - 07 - MVVM示例

    滴咚,大家好久不见.好就没写东西了,鸽着鸽着就无了... 回到正题,上篇文章说完命令提了一嘴MVVM模式直接就上MVVMLight这些程序的框架了,虽然也没说多少,但还是有点不好过渡,这篇对MVVM做 ...

  2. ZS Shuffles Cards 题解

    ZS Shuffles Cards 题解 我们把每一次抽一些数字牌再抽到 joker 视作一局游戏. 每局期望轮数 首先考虑 \(f_i\) 表示每一局游戏抽出 \(i\) 张牌的概率. 那么就是先抽 ...

  3. 这才叫 API 接口设计!

    API 接口设计 Token 设计 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上 ...

  4. MindSponge分子动力学模拟——Constraint约束

    技术背景 在前面的几篇博客中,我们已经介绍了MindSponge的基本使用方法,比如定义一个分子系统.计算分子的单点能以及迭代器的使用等.有了这些基础的教程,用户以及可以执行一些比较简单的模拟任务,比 ...

  5. HDFS核心概念与架构

    HDFS简介 HDFS是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理,它基于流数据模式访问和处理超大文件的需求而开发,可以运行在廉价的商用服务器上,为海量数据提供 ...

  6. windows10 jdk下载及环境配置

     一.环境准备 windows10 系统 jdk 各种版本(配置大同小异) 二.下载并安装jdk 下载地址:http://www.oracle.com/technetwork/java/javase/ ...

  7. 主动写入流对@ResponseBody注解的影响

    问题回溯 2023年Q2某日运营反馈一个问题,商品系统商家中心某批量工具模板无法下载,导致功能无法使用(因为模板是动态变化的) 商家中心报错(JSON串): {"code":-1, ...

  8. 【RocketMQ】顺序消息实现总结

    全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...

  9. mpi转以太网连接300PLC与施耐德 Quantum PLC 通讯

    S7300 PLC转以太网无需编程与施耐德 Quantum PLC modbusTCP通信 方案介绍: 西门子300PLC转以太网不需要编写程序通过兴达易控MPI-ETH-XD1.0与施耐德 Quan ...

  10. vue2实现饼图Pie组件封装

    实现如下效果: 效果展示:https://code.juejin.cn/pen/7226656439941955644 如果不会请移步到官网的栗子,请点击查看 直接给大家上代码: 整体代码片段 1 & ...