题目

地址为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. 自治系统/自治域和自治系统编号(ASN)

    定义: 自治系统或自治域(英文:Autonomous system, AS)是指在互联网中,一个或多个实体管辖下的所有IP网络和路由器的组合,它们对互联网执行共同的路由策略.参看RFC 1930中更新 ...

  2. 聚焦Web前端安全:最新揭秘漏洞防御方法

    在 Web 安全中,服务端一直扮演着十分重要的角色.然而前端的问题也不容小觑,它也会导致信息泄露等诸如此类的问题.在这篇文章中,我们将向读者介绍如何防范Web前端中的各种漏洞.[万字长文,请先收藏再阅 ...

  3. 让 GPT-4 来修复 Golang “数据竞争”问题 - 每天5分钟玩转 GPT 编程系列(6)

    目录 1. Golang 中的"数据竞争" 2. GoPool 中的数据竞争问题 3. 让 GPT-4 来修复数据竞争问题 3.1 和 GPT-4 的第一轮沟通 3.2 和 GPT ...

  4. Mybatis插件功能

    1 插件的作用 在Mybatis执行SQL的生命周期中,会使用插件进行埋点,主要包括Executor.StatementHandler.ParameterHandler和ResultSetHandle ...

  5. 每日一题:AJAX进度监控(附可运行源码)

    1.什么是AJAX AJAX(Asynchronous JavaScript and XML)是一种用于在网页上进行异步通信的技术.它允许在不刷新整个页面的情况下,通过在后台与服务器进行数据交换来更新 ...

  6. JDK8升级JDK11最全实践干货来了

    1.前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本.那么从JDK8到JDK11,到底带来了哪些特性呢 ...

  7. 「co-examination - A」

    破壁,组合意义法: 五种颜色 \(\star,a,b,c,d\). 对于 l.h.s. 钦定 \(k\),在 \(3n+k\) 个球中选出 \(2n\) 个球染色,在靠左的 \(n\) 个球中选 \( ...

  8. Solution -「洛谷 P6287」「COCI 2016-2017」Mag

    Description Link. 定义一条链的价值为链上点权乘积除以节链上点数,求一条价值最小的链. Solution 结论:答案链上最多包含一个 \(2\)(其余全为 \(1\)),并且不在链的两 ...

  9. Spring扩展接口(1):ApplicationContextInitializer

    在此系列文章中,我总结了Spring扩展接口,以及各个扩展点的使用场景.并整理出一个bean在spring中从被加载到初始化到销毁的所有可扩展点的顺序调用图.这样,我们也可以看到bean是如何一步步加 ...

  10. Spring Boot RestController接口如何输出到终端

    背景 公司项目的批处理微服务,一般是在晚上固定时段通过定时任务执行,但为了预防执行失败,我们定义了对应的应急接口,必要时可以通过运维在终端中进行curl操作.然而,部分任务耗时较长,curl命令执行后 ...