首页 > 编程语言 >ARM汇编指令实验

ARM汇编指令实验

时间:2023-10-23 11:46:34浏览次数:50  
标签:汇编 R0 R1 R2 R3 数据 指令 DATA 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位置交换,则可以实现数据从大到小的排序。

实验结论及分析

此次实验的冒泡排序采用了嵌套循环,将数组中左右的数进行比较,如果左边的数大于右边的数则进行交换。如果要从大到小排序,则与之相反,右边的数大于左边的数就进行交换,因此,在源程序中只改变一步即可实现数据的从大到小排序。

标签:汇编,R0,R1,R2,R3,数据,指令,DATA,ARM
From: https://www.cnblogs.com/sillyfox/p/17782053.html

相关文章

  • OpenHarmony Meetup成都站招募令
    OpenHarmony Meetup城市巡回成都站火热招募中!! 日期:2023年10月27日14:00地点:电子科技大学(沙河校区)学术交流中心一楼104会议室 与OpenHarmony技术大咖近距离互动,分享技术见解,结交志同道合的朋友!活动主题聚焦OpenHarmony开源创新~议题内容设置由浅入深,带您一......
  • HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能
     AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。开发指导使用AudioRenderer播放音频涉及到AudioRenderer实例的创建、音频渲染参数的配置、渲染的......
  • 汇编坤坤积极知识
    zf标志如果运算结果为0显示ZR否则显示NZpf标志如果运算结果的所有bit位中1的个数位偶数pf=1,也就是PE,反之为0也就是显示P0,偶数个就是EVEN,奇数个就是ODD。所以EOsf标志,相关指令执行后,其结果是否为负,如果是负sf=1,显示NG(negative)否则非负是sf=0,显示PL(positive).对于计算机来说,A......
  • 探索CPU的黑盒子:解密指令执行的秘密
    引言在我们之前的章节中,我们着重讲解了CPU内部的处理过程,以及与之密切相关的数据总线知识。在这个基础上,我们今天将继续深入探讨CPU执行指令的相关知识,这对于我们理解计算机的工作原理至关重要。CPU是一系列寄存器的集合体我们以使用的IntelCPU为例,其中包含数百亿个晶体管......
  • Pycharm 2023.2 最新po jie版安装教程(附激活码,亲测有效)
    申明:本教程Pycharmpojie补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!前言笔者分享一种比较靠谱的Pycharm pojie方案:激活脚本+激活码(全自动模式),即本文教程所写,这种方法适合最新的几个版本,具体步骤跟着本文教程一步......
  • win32汇编-分支语句
    分支语句用来根据条件表达式测试的真假执行不同的代码模块,MASM中的分支语句的语法如下: 注意:关键字if/elseif/else/endif的前面有个小数点,如果不加小数点,就变成宏汇编中的条件汇编伪操作了,结果可是天差地别。         ......
  • 统信桌面操作系统UOS上安装arm64版nginx
    hello,大家好啊,今天给大家带来一篇在统信桌面操作系统UOS上安装arm64版nginx的文章,本篇文章主要是给大家提供一种下载离线nginx软件包的方法,拿到软件包可以去不能链接互联网又没有仓库环境的电脑上安装,欢迎大家浏览分享,点一个关注可好。1、下载nginx离线包到本地pdsyw@pdsyw-PC:~/De......
  • win32汇编-条件测试语句
      MASM条件测试的基本表达式是:       ......
  • 揭秘计算机指令执行的神秘过程:CPU内部的绝密操作
    计算机指令从软件工程师的角度来看,CPU是执行计算机指令的逻辑机器。计算机指令可以看作是CPU能够理解的语言,也称为机器语言。不同的CPU能理解的语言不同。例如,个人电脑使用Intel的CPU,苹果手机使用ARM的CPU。这两种CPU支持的语言不同。这些不同CPU支持的语言被称为不同的指令集。......
  • 嵌入式(MCU)STM32L496QEI6/STM32L496QGI3基于ARM®Cortex®-M4内核
    一、简介STM32L432位MCU+FPU是超低功耗微控制器,基于高性能的ARM®Cortex®-M432位RISC内核,工作频率高达80MHz。Cortex-M4内核具有单浮点单元(SFPU)精度,支持所有ARM单精度数据处理指令与数据类型。同时执行全套DSP指令和存储保护单元(MPU),增强应用安全性。明佳达供求嵌入式(MC......