assembly - 如何在 ARM 汇编中使用 push{lr} pop{pc}
问题描述
我已经尝试了几天并且在网上到处寻找但没有得到解决方案所以我会在这里尝试问:我有这个简化的代码作为示例 - 它应该在没有操作系统的情况下闪烁覆盆子上的 LED (独立)。到目前为止,LED 会亮起并且永远不会再次熄灭。延迟循环不是问题,因为它在代替“bl delayloop”时起作用,问题在于推送弹出。为了让我将其翻译成更复杂的项目,需要使用这些,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
为指向您希望用作堆栈的内存区域的正上方。
推荐阅读
- azure-cosmosdb - SQL 到 Cosmos DB 的迁移,我们是否需要多个容器作为 SQL 中的不同表?
- jquery - jQuery ui sortable how to change prev/next item position in table structure
- javascript - Prevent sequelize from soft deleting rows that are referenced somewhere else
- javascript - Is there any possible way to create a "flying" container?
- r - 如何将所有 Linux 环境变量读入 Docker 容器中的 R?
- javascript - 如何通过给定的点标签计算数组?
- python - 通过 python (Py2neo) 将大型数据集转录到 Neo4j
- node.js - 如何在mongoDB中动态添加匹配条件?
- java - 将 Spring HATEOAS 添加到 pom.xml 失败
- php - 在我的脚本完成很久之后,MySQL (RDS) 查询在我的进程列表中运行