如何在ARMv7中写入R14(链接寄存器)

时间:2018-02-24 16:48:14

标签: arm cpu-registers cortex-m

我试图在中断结束时将0xFFFFFFF9加载到LR寄存器,以便它可以退出中断。我这样做是因为我的代码在中断代码中篡改了LR寄存器。简单的MOV指令似乎不起作用。 有关如何做的任何建议? 提前致谢

2 个答案:

答案 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指令集。