【ARM汇编的循环运用】正向遍历|逆向遍历

本文详细讲解了如何使用ARM汇编语言实现数组的正向和逆向遍历,涉及循环框架构建、地址操作和数据处理。通过实例演示了如何通过地址加减操作和后索引寻址来遍历数组,适合深入理解汇编语言的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  作者简介:大家好我是IM汤姆凯特,大家可以叫我汤姆
 个人主页:IM汤姆凯特的优快云博客
 系列专栏:【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的堆栈类型💦

评论 119
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IM汤姆凯特

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

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

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

打赏作者

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

抵扣说明:

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

余额充值