如何在ARM子例程中访问堆栈上的值?

时间:2017-10-23 15:38:22

标签: assembly arm

所以我想从命令行读取10个整数,然后通过子程序打印这些值的总和。

我有以下相关代码:

...

sub sp, sp, #40 // making room on the stack
mov r4, sp      // use r4 as our working register for where we are in our space
   loop:
      (looping through this 10 times)
      ldr r0, =rdfmt
      mov r1, r4
      bl scanf
      add r4, r4 #4
   done:
      bl sum
sum:
   push {lr}
   (how do I load those back in from the stack?)

...

在我的sum子例程中,我想重复遍历堆栈10次,得到我刚读过的值的总和。你是怎么做到的?

1 个答案:

答案 0 :(得分:4)

与大多数CISC CPU(x86,m68k ...)不同,ARM CPU不会在函数调用上修改堆栈指针(sp)。但是,在执行push指令时,它们会从堆栈指针中减去4。

当执行bl sum指令时,10个整数位于存储器中,从sp寄存器指向的地址开始。在push {lr}指令后,这些整数仍在该位置,但sp的值比以前少了4个 - 所以现在可以在地址sp+4找到10个整数。

将地址sp+4中的第一个整数加载到寄存器中。然后将地址sp+8中的整数加载到另一个寄存器中并添加两个寄存器。使用地址sp+12处的整数重复此操作,依此类推......