Assembly 臂组件,;在循环后使用ldr保持相同的r2

Assembly 臂组件,;在循环后使用ldr保持相同的r2,assembly,arm,Assembly,Arm,我不熟悉arm汇编语言。 在结束循环后,我试图用相同的r0值继续加载r2。但是,当我第二次运行代码ldr r2[fp,#4]时,值发生了变化。我应该怎么做来修复它,以便我可以使用与r0相同的值来ldr r2 .syntax unified .global main .type main, %function main: ldr r1, =storage @ your code starts here bl addvalue initial_pointer: addvalue:

我不熟悉arm汇编语言。 在结束循环后,我试图用相同的r0值继续加载r2。但是,当我第二次运行代码ldr r2[fp,#4]时,值发生了变化。我应该怎么做来修复它,以便我可以使用与r0相同的值来ldr r2

.syntax unified
.global main
.type main, %function


main:
  ldr r1, =storage
  @ your code starts here
  bl addvalue

initial_pointer:
addvalue:
   stmdb sp!,{fp,lr}
   add fp,sp,#4
   sub sp,#4
   str r0,[fp,#-8]
   ldr r0,[r1],4
   str r0,[sp,4]! @provide r0 to next branch
   bl get_loop
   add sp,#4
   add sp,#4
   ldmia sp!,{fp,lr}
   bx lr
get_loop:
  stmdb sp!,{fp,lr}
  add fp,sp,#4
  sub sp,#4
  ldr r2,[fp,#4] @load r2 with the value of r0
  bl loop
  add sp,4
  ldmia sp!,{fp,lr}
  bx lr
loop:
   cmp r2,0 @loop control
   beq get_loop
   sub r2,1
   b loop
   
  b main





.size main, .-main
.data
storage:
  .word 5, 3, 2, 1
但是,当我第二次运行代码ldr r2[fp,#4]时,值发生了变化

因为
fp
已更改,所以您正在读取不同的内存地址

  stmdb sp!,{fp,lr}  # sp is changed here by 2regs * 4Bytes = 8Bytes
  add fp,sp,#4       # fp = sp from previous iteration - 8 + 4

bl-loop
+
beq-get\u-loop
不酷。若你们调用了一个“函数”,你们就可以正确地从函数返回,而不是通过简单的“分支”返回,为什么
addvalue
看起来像是除了增加值以外的任何东西呢?