我试图在中断结束时将0xFFFFFFF9加载到LR寄存器,以便它可以退出中断。我这样做是因为我的代码在中断代码中篡改了LR寄存器。简单的MOV指令似乎不起作用。 有关如何做的任何建议? 提前致谢
答案 0 :(得分:1)
在这种情况下,操纵LR很常见。虽然previous answer对于特殊值敏感的PC是正确的,但使用BX LR
作为特殊值是常见的(并且与建议的做法一致)返回指令,以便在返回之前操纵LR是合适的。
如果常数在允许的范围内,MOV就没有理由不起作用;如果不是,请使用LDR =
伪指令(无论如何,在ARM装配工具上,不要了解其他装配工),以避免手工将常数放在一起的笨拙工作
如果MOV似乎无法正常工作(您还没有提供任何代码,或者说您的意思似乎不起作用,那么请检查LR是否有效在返回之前被覆盖。请记住,隐含的回报'是一种非常常见的模式,LR被推到函数顶部的堆栈中,最后直接弹出到PC中:
PUSH {r4-r6,lr} ... POP {r4-r6,pc} ; implicit return
答案 1 :(得分:0)
可能没有必要使用LR,它是对特殊值敏感的PC。
来自Cortex-M通用设备user guide
当处理器处于处理程序模式时,会发生异常返回 执行以下指令之一尝试将PC设置为 EXC_RETURN值:
加载PC的LDM或POP指令
以PC作为目的地的LDR指令
使用任何寄存器的BX指令。
处理器在异常输入时将EXC_RETURN值保存到LR。 异常机制依赖于此值来检测何时 处理器已完成异常处理程序。比特[31:4] EXC_RETURN值为0xFFFFFFF。处理器加载值时 将此模式与PC匹配,它检测到操作不是 一个正常的分支操作,而是异常 完成。因此,它启动异常返回序列。 EXC_RETURN值的位[3:0]表示所需的返回堆栈 和处理器模式,如表2.17所示。
稍后在同一document:
限制您只能在MOV指令中使用SP和PC,但有以下限制:
第二个操作数必须是不带移位的寄存器
您不能指定S后缀。
当MO是MOV指令中的PC时:
写入PC的值的位[0]被忽略
通过强制该值的位[0]创建的地址发生分支。
注意虽然可以使用MOV作为分支指令,但ARM强烈建议使用BX或BLX指令进行分支。 软件可移植到ARM指令集。