所以我想从命令行读取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次,得到我刚读过的值的总和。你是怎么做到的?
答案 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
处的整数重复此操作,依此类推......