【ARM汇编数组】输出数组中最大值最小值

在这里插入图片描述

CSDN话题挑战赛第1期
活动详情地址话题PK赛
参赛话题:汇编知识分享
话题描述:我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。

大家好,我是汤姆凯特。

在这里插入图片描述

每篇前言

☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
🐋个人主页:IM汤姆凯特的CSDN博客
🎁系列专栏:【ARM嵌入式基础】


如何用汇编输出数组中最大值最小值?

前面讲到对数组数据的判断,判断正负数和对数组数据循环求和。这里通过依次比较数据中的数据,选出最大值,为之后用汇编进行冒泡排序提供依据。

一、建立数组循环框架

1.全局变量

  • 全局变量中需要先定义输出语句的格式串
  • 定义一个数组和确定数组的长度
.data 

	 fmt:.asciz " min=%d\n max= %d\n" 
	 array:.word 12,4, -168,122,-33,56,78,99,345, 66,-5 
	.equ nx,( . - array)/4  

2.循环框架构建

  • 先构检出汇编的框架
  • 然后在main中定义一个循环变量r4,再把数组的地址先获取到
  • 构建循环,循环次数由全局变量中的数组长度确定
.text 
.globl main 
 main: 
	 push {lr}         
	 mov r4,#0              
	 ldr r5, =array           
	 ......         
	 b  L1 
loop: 
  	......
	......
	add r4,#1 
L1: cmp r4,#nx   
	blo loop   

二、添加循环核心语句

1.先确定存最小值、最大值的地方

  • 这个程序需要输出两个数据(最小值、最大值)这里我们可以先用寄存器存放
  • 这里先用r6作为最小值的存放,r8作为最大值的存放
  • 由于这两个寄存器要存放数组中的最小值最大值,所以初始化值应该存放数组的首地址
	 ldr r6,[r5] 
	 ldr r8,[r5] 

2.判断并更新r6和r8的数据

找出最小值最大值的思想是:遍历数组中的元素,出现一个数比较两次。以此保证r6中存放的永远是最小的,r8存放的永远是最大的。

  • 一次是跟当前存在r6中的最小值,如果当前r6大于这个数,让这个数替换掉r6,成为新的r6;
  • 另一次是跟当前存在r8中的最大值比较,如果当前r8小于这个数,让这个数替换掉r8,成为新的r8 。
    ldr r7,[r5],#4    //r7依次指向循环中的每一个元素
	cmp  r6,r7        	 
    ldrgt r6,[r5,#-4]   //r5的值并不会改变,将较小的值放到r6
	cmp r8,r7
	ldrlt r8,[r5,#-4]   //r8存放较大的值

3.输出语句

  • 全局变量的格式串中,min在前,max在后,所以把r6的值传给r1,r8的值传给r2 。
	ldr r0, =fmt      
	mov r1,r6  //r6存放min
	mov r2,r8  //r8存放max
	bl printf 

整体代码

//输出数组中最小值最大值
.data 
	 fmt:.asciz " min=%d\n max= %d\n" 
	 array:.word 12,4, -168,122,-33,56,78,99,345, 66,-5 
	.equ nx,( . - array)/4   
.text 
.globl main 
 main: 
	 push {lr}         
	 mov r4,#0              
	 ldr r5, =array           
	 ldr r6,[r5] 
	 ldr r8,[r5]           
	 b  L1 
loop: 
  	
    ldr r7,[r5],#4    //r7依次指向循环中的每一个元素
	cmp  r6,r7        	 
    ldrgt r6,[r5,#-4]   //r5的值并不会改变,将较小的值放到r6
	cmp r8,r7
	ldrlt r8,[r5,#-4]   //r8存放较大的值
	add r4,#1 
L1: cmp r4,#nx   
	blo loop   

	ldr r0, =fmt      
	mov r1,r6  //r6存放min
	mov r2,r8  //r8存放max
	bl printf        
	mov r0, #0       
	pop {lr}  
	mov pc, lr            
.end

运行调试

在这里插入图片描述


总结

  • 找出最小值最大值的思想是:遍历数组中的元素,出现一个数比较两次。以此保证r6中存放的永远是最小的,r8存放的永远是最大的。

  • 用CMP和带后缀指令不断更新最大值最小值。

  • [r5,#-4] 这种寻址方式不改变r5的值,[r5,#-4]!这种方式是前索引改变r5的值。


本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问可以在评论区留言!
下期预告: ARM汇编判断奇数偶数

CSDN话题挑战赛第1期
活动详情地址话题PK赛

  • 33
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IM汤姆凯特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值