ARM:如何处理堆栈指针



我有以下教授的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
sub sp, sp, #4

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

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

最新更新