作者简介:大家好我是IM汤姆凯特,大家可以叫我汤姆
个人主页:IM汤姆凯特的CSDN博客
系列专栏:【ARM嵌入式基础】
每日一句:
通常情况下为了得到某种东西,一定要放弃另一些东西的最大价值。
ARM汇编如何逆向遍历数组?
写在前面:想要知道如何逆向遍历数组先得了解正向遍历数组的逻辑是什么?在汇编中遍历数组跟高级语言是一样的都要把执行语句放到循环中,循环框架的构建可以看这篇文章
跟高级语言不一样的是,它不像高级语言那样把很多函数都封装好,然后直接通过关键字调用就行了。汇编语言中是需要我们通过汇编命令,手动的进行取地址和地址转换的,虽然这样麻烦了很多,但是它离机器语言更近,执行的效率会很高。
1.正向遍历数组
1.1先把ARM汇编框架写出来摆到那里(写所有汇编都可以先这样)
.data ……………… .text .globl main main: push {lr} ……………… mov r0, #0 pop {lr} mov pc, lr .end
1.2把循环框架放到main中
loop: ………… add r4,#1 testfor:cmp r4,#counter blt loop
1.3定义全局变量
1.3.1最后要打印出来:定义打印的格式
1.3.2遍历数组:定义要遍历的数组值
1.3.3循环多少次:取决于数组中有多少个数,通过地址作差除4求出多少个数
.data fmt:.asciz "%10d\n" ary:.word 0,1,2,3,4,5,6,7,8,9 .equ counter,( . - ary)/4
1.4局部变量声明
1.4.1循环变量 i 的声明:这里用r4来表示先给他清零
1.4.2数组读取到寄存器:通过LDR伪指令
mov r4,#0 ldr r5, =ary
1.5构建执行的遍历语句
1.5.1后索引寻址:从数组的首地址(存r5中)存到r1然后+4(一个word的长度)
1.5.2打印输出:先把输出格式放到r0,再调用printf
ldr r1,[r5],#4 bl printf
1.6运行尝试

2.逆向遍历数组
跟正向输出唯一不同的地方:需要先把地址指向数组的最后一个值然后让他向前遍历即可。
1.在全局变量中加一个存数组长度的伪指令
.equ len,(.-ary)-4
2.让寄存器的数指向数组最后一个数
mov r6,#len ldr r5, =ary add r6,r5
这里是放到了r6中
3.指到最后一个值就可以让他 -4向后遍历
ldr r1,[r6],#-4
4.整合输出
.data fmt:.asciz "%10d\n" ary:.word 0,1,2,3,4,5,6,7,8,9 .equ len,(.-ary)-4 .equ counter,( . - ary)/4 .text .globl main main: stmfd sp!,{lr} mov r4,#0 mov r6,#len ldr r5, =ary add r6,r5 b testfor loop: ldr r0,=fmt ldr r1,[r6],#-4 bl printf add r4,#1 testfor:cmp r4,#counter blt loop mov r0, #0 ldmfd sp!,{lr} mov pc, lr .end
运行结果:

总结:
1.通过数组的正向遍历和逆向遍历,加强对循环的运用
2.在遍历时,需要通过地址的加减来得到指针指向的位置
3.通过每个数的地址长度来加法遍历或减法遍历
本期就结束了,如果对您有帮助,点赞+评论支持一下博主再走吧
还没有关注汤姆的朋友,点个关注每天学一点汇编

下期预告:拖更的ARM的堆栈类型?
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205866.html原文链接:https://javaforall.net
