ARM:如何处理堆栈指针?

时间:2017-05-25 10:45:42

标签: pointers assembly arm raspberry-pi3

我的教授提供了以下的ARM汇编代码。 我不明白为什么我需要将堆栈指针移动到r1以及究竟发生了什么。

我从讲座中得知,......

  

堆栈指针指向堆栈上最后写入的值。

指向总是表示存储地址吗? 我设法使代码工作。但我希望提高代码质量并了解正在发生的事情。此外,我不允许在程序的任何地方使用算术运算。 我也尝试了调试器。但我只知道如何从那里观看节目计数器。 我用了

info registers sp pc

disas

我搜索了调试器的所有选项,但找不到有用的东西。

在堆栈指针寄存器中存储 - 我猜测 - 一些地址值。

// scan for users answer 'y'
ldr     r0, =charplace
mov     r1, sp              @ ???
bl      scanf               @ Scan user's answer
ldr     r1, =yes            @ Put address of 'y' in r1
ldrb    r1, [r1]            @ Load the actual character 'y' into r1

在主要功能的开头我这样做:

        .global main
main:                   
     push   {r4 - r7, lr}   @ copy values of these reg on top of the stack
     sub     sp, sp, #4     @ needs to be replaced ! TODO

最后这个:

end: add    sp, sp, #4      @ needs to be replaced ! TODO
     pop    {r4 - r7, pc}   @ copy values from the top of the stack back into these registers

1 个答案:

答案 0 :(得分:2)

sub sp, sp, #4为缓冲区分配4个字节的空间。使用完整的降序堆栈,sp将指向该缓冲区的开头,其他3个字节当然位于sp+1sp+2sp+3。将sp移至r1的原因是scanf需要缓冲区地址作为第二个参数,r1用于传递它。

gdb中,您可以使用x命令检查内存,以查看您可以执行的堆栈,例如x/4x $sp。有关格式说明符,请参阅help x