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

如何在ARMv7中写入R14(链接寄存器),arm,cpu-registers,cortex-m,Arm,Cpu Registers,Cortex M,我试图在中断结束时将0xFFFFF9加载到LR寄存器,以便它可以退出中断。我这样做是因为我的代码篡改了中断代码中的LR寄存器。简单的MOV指令似乎不起作用。 有什么建议吗? 提前感谢可能不需要使用LR,电脑对特殊值敏感 来自Cortex-M通用设备 当处理器处于处理程序模式且 执行以下指令之一,尝试将电脑设置为 EXC_返回值: 加载电脑的LDM或POP指令 以PC为目标的LDR指令 使用任何寄存器的BX指令 处理器将EXC_返回值保存到LR on异常条目。 异常机制依赖于此值来检测 处理器已完

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

可能不需要使用LR,电脑对特殊值敏感

来自Cortex-M通用设备

当处理器处于处理程序模式且 执行以下指令之一,尝试将电脑设置为 EXC_返回值:

加载电脑的LDM或POP指令

以PC为目标的LDR指令

使用任何寄存器的BX指令

处理器将EXC_返回值保存到LR on异常条目。 异常机制依赖于此值来检测 处理器已完成异常处理程序。数据的位[31:4] EXC_返回值为0xFFFFFFF。当处理器加载一个值时 将此模式与PC匹配时,它会检测到操作不正确 正常的分支操作,而不是异常 完成因此,它启动异常返回序列。 EXC_返回值的位[3:0]表示所需的返回堆栈 和处理器模式,如表2.17所示

同一天晚些时候:

限制您只能在MOV指令中使用SP和PC,但有以下限制:

第二个操作数必须是不带移位的寄存器

不能指定S后缀

当Rd是MOV指令中的PC时:

写入PC的值的位[0]被忽略

通过强制该值的位[0]为0而创建的地址发生分支

注意:尽管可以使用MOV作为分支指令,但ARM强烈建议使用BX或BLX指令进行分支 ARM指令集的软件可移植性


操纵LR在这种情况下很常见。虽然PC对特殊值敏感是正确的,但使用BX LR作为返回指令是常见的,并且与推荐做法一致,因此在返回之前操纵LR是适当的

如果常数在允许范围内,MOV没有理由不工作;如果不是,那么就在stock-ARM汇编程序上使用LDR=pseudo指令,因为不知道其他汇编程序如何避免手工将常量组合在一起的繁重工作

如果MOV似乎不起作用,您没有提供任何代码,或者说您所说的“似乎不起作用”,那么请检查LR在返回之前没有被覆盖。请记住,“隐式返回”是一种非常常见的模式,其中LR被推到函数顶部的堆栈中,并在末尾直接弹出到PC中:

PUSH {r4-r6,lr} ... POP {r4-r6,pc} ; implicit return
您有故障代码的代码片段吗?我希望您指的是armv7-m而不是arm7?这不是你从cortex-m中断中返回的方式,最肯定的不是ARM7。如果您阅读了ARM的文档,那么如果这是armv7-m,您可以在一条指令中执行此操作~0xFFFFFFF9等于多少?或者,传统的thumb armv6-m armv4tarm7可能会立即移动到较低的寄存器,否定,mov移动到较高的寄存器。所有这些都在arm文档中,您在进入汇编语言之前应该拥有这些文档。