优快云话题挑战赛第1期
活动详情地址:话题PK赛
参赛话题:汇编知识分享
话题描述:我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。
大家好,我是汤姆凯特。
文章目录
☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
🐋个人主页:IM汤姆凯特的优快云博客
🎁系列专栏:【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的值。
优快云话题挑战赛第1期
活动详情地址:话题PK赛