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大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...
随机推荐
- CVE-2023-2825-GitLab目录穿越poc
Gitlab CVE-2023-2825 目录穿越漏洞 前言 昨天 GitLab 出了一个版本目录穿越漏洞(CVE-2023-2825),可以任意读取文件.当时我进行了黑盒测试并复现了该漏洞. &qu ...
- Python实现商城购物经典案例
代码分步骤思路: 商城添加商品:opea_db = [{'store_name': '手机','num': 1}] while True: store_name=input('请输入需要存放的商品(按 ...
- C++笔记(自用)
<Effective C++> 条款11 在operator=中处理"自我赋值" 自我赋值 证同测试: if(this==&rhs)return*this; 影 ...
- QA|workon env后没有进入虚拟环境,但也没有报错,但cmd可以|Python虚拟环境
问题:pycharm的terminal执行workon env后没有进入虚拟环境,但也没有报错 但cmd可以 原因:因为pycharm的terminal用的是powershell,更改为cmd,重新打 ...
- 微信小程序隐私保护协议修改方法 uniapp
微信隐私保护协议指南 一天天没事闲的 01 在manifest.json 中添加一行 "__usePrivacyCheck__" : false 02 自定义一个弹窗组件 ...
- 10款Visual Studio实用插件
前言 俗话说的好工欲善其事必先利其器,安装一些Visual Studio实用插件对自己日常的开发和工作效率能够大大的提升,避免996从选一款好的IDE实用插件开始.以下是我认为比较实用的Visual ...
- 「codeforces - 1208F」Bits and Pieces
link. 考虑把原问题写成一个在 \(\left(\log_2 \max v \right) \times n\) 的矩阵里选出三列,我们首先预处理出 \(j \cap q\).具体,我们需要对于每 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理
在我们窗口新增.编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时 ...
- dp_ppi转光纤模块连接200PLC组态王通信案例
DP_PPI转光纤模块连接200PLC组态王光纤通信在冷却塔控制系统案例 现场背景介绍: 西门子200 CPU226PLC通过兴达易控dp转光纤模块在200PLC系统中ppi转光纤实现PCL与组态王2 ...
- netstat命令输出详解
netstat命令输出详解 1. 列出所有的TCP和UDP端口 2. 命令输出详解 Proto:协议名(tcp协议还是udp协议) recv-Q:网络接收队列,send-Q:网路发送队列 a. rec ...