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大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...
随机推荐
- 从redis未授权访问到获取服务器权限
从redis未授权访问到获取服务器权限 好久没写博客了,博客园快荒芜了.赶紧再写一篇,算是一个关于自己学习的简要的记录把. 这里是关于redis未授权访问漏洞的一篇漏洞利用: 首先是redis,靶场搭 ...
- 深度学习(十二)——神经网络:搭建小实战和Sequential的使用
一.torch.nn.Sequential代码栗子 官方文档:Sequential - PyTorch 2.0 documentation # Using Sequential to create a ...
- 一台服务器上部署 Redis 伪集群
哈喽大家好,我是咸鱼 今天这篇文章介绍如何在一台服务器(以 CentOS 7.9 为例)上通过 redis-trib.rb 工具搭建 Redis cluster (三主三从) redis-trib.r ...
- 《Web安全基础》02. 信息收集
@ 目录 1:CDN 绕过 1.1:判断是否有 CDN 服务 1.2:常见绕过方法 1.3:相关资源 2:网站架构 3:WAF 4:APP 及其他资产 5:资产监控 本系列侧重方法论,各工具只是实现目 ...
- 论文解读(WDGRL)《Wasserstein Distance Guided Representation Learning for Domain Adaptation》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Wasserstein Distance Guided Representation Learning f ...
- API接口设计规范
说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢? 下面我们 ...
- 2.7 PE结构:重定位表详细解析
重定位表(Relocation Table)是Windows PE可执行文件中的一部分,主要记录了与地址相关的信息,它在程序加载和运行时被用来修改程序代码中的地址的值,因为程序在不同的内存地址中加载时 ...
- WebAPI接口文档快速编写
近期项目使用了WebAPI,需要先给出接口文档,本着能省事就省事的原则,自然最好是能找到自动生成文档的方式. 一.使用Apifox,官网写着这是个API一体化协作平台,说白了,对于我来说,这就是个测试 ...
- JS深入学习笔记 - 第一章.构造函数原型与原型链
1.构造函数和原型 1.1 概述 在典型的 OOP语言中(如Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前,JS并没有引入类的概念. 在ES6之前,对象不是基于类创建的 ...
- 【RocketMQ】【源码】延迟消息实现原理
RocketMQ设定了延迟级别可以让消息延迟消费,延迟消息会使用SCHEDULE_TOPIC_XXXX这个主题,每个延迟等级对应一个消息队列,并且与普通消息一样,会保存每个消息队列的消费进度(dela ...