我的教授提供了以下的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
答案 0 :(得分:2)
sub sp, sp, #4
为缓冲区分配4个字节的空间。使用完整的降序堆栈,sp
将指向该缓冲区的开头,其他3个字节当然位于sp+1
,sp+2
和sp+3
。将sp
移至r1
的原因是scanf
需要缓冲区地址作为第二个参数,r1
用于传递它。
在gdb
中,您可以使用x
命令检查内存,以查看您可以执行的堆栈,例如x/4x $sp
。有关格式说明符,请参阅help x
。