如何在ARM程序集中使用push{lr}pop{pc}



我已经尝试了好几天,在网上到处寻找,但还没有找到解决方案,所以我试着在这里问:我有一个简化的代码作为例子-它应该在没有操作系统的情况下在树莓上闪烁LED(独立(。从现在起,LED一直亮着,再也不会熄灭。延迟环路不是问题所在,因为它在代替"延迟"时起作用;bl delaylop";,问题出在推送pop上。这些都需要使用,以便我将其转化为一个更复杂的项目,bx-lr不是一个选项。非常感谢您的帮助!!


_run_morse:
_short_blink:

str r1,[r0,#GPSET0]
mov r10,#0
bl delayloop

str r1,[r0,#GPCLR0]

mov r10,#0
bl delayloop
b _run_morse
delayloop:
push {lr}
delayloop2:
add r10,r10,#4
cmp r10,r2
bne delayloop2
pop {pc}

您似乎没有将堆栈指针(sp/r13(设置为指向合适内存的指针,并且程序不会在为您初始化的操作系统下运行。

您应该将sp设置为指向要用作堆栈的内存区域的正上方。

要从armv7上的叶子程序返回,只需mov pc, lr即可,无需访问堆栈。

调用方OTOH应为push lr; pop pc,因为它也需要返回,并且需要丢弃寄存器lr。无论如何,人们都可以选择在整个代码中使用这种范式。

我宁愿怀疑delaylop2中花费的时钟周期数一定太低,LED无法闪烁,delaylop1永远不会返回,或者关闭LED的代码失败。

最新更新