在ARM架构中,该地址通常被保存在链接寄存器(Link Register,LR)中。然而,异常模式下并不存在专门用于保存返回地址的LR_excep寄存器。 区别在哪
时间: 2024-04-18 12:34:06 浏览: 142
在ARM架构中,链接寄存器(Link Register,LR)用于保存函数调用或者异常处理过程中的返回地址。在正常情况下,LR寄存器用于保存跳转回函数调用或指令执行的下一条指令的地址。
然而,在异常处理过程中,由于异常模式的切换,LR寄存器的作用会有所不同。在异常模式下,LR寄存器被用于保存从异常处理程序返回时的地址。但是,并不存在专门用于保存返回地址的LR_excep寄存器。
不同的异常模式可能有不同的方式来保存返回地址。例如,在ARMv7-A架构中,当从非特权模式切换到异常模式时,返回地址会被保存在异常模式堆栈中的LR寄存器。而从用户模式切换到异常模式时,则使用异常向量表中的相应异常向量来获取返回地址。
因此,区别在于异常模式下LR寄存器的使用方式和保存的内容。在正常情况下,它保存下一条指令的地址,而在异常处理过程中,它保存从异常处理程序返回时的地址。
相关问题
当前程序被异常打断,切换到异常处理程序里,异常处理完之后,返回当前被打断模式继续执行,因此必须要保存当前执行指令的下一条指令的地址到LR_excep(异常模式下LR,并不存在LR_excep寄存器,为方便读者理解加上_excep,以下道理相同),由于异常模式不同以及ARM内核采用流水线技术,异常处理程序里要根据异常模式计算返回地址。
在ARM架构中,当发生异常并切换到异常处理程序时确实需要保存当前执行指令的下一条指令的地址,以便在异常处理程序完成后返回到被打断的模式并继续执行。
在ARM架构中,该地址通常被保存在链接寄存器(Link Register,LR)中。然而,异常模式下并不存在专门用于保存返回地址的LR_excep寄存器。
为了解决这个问题,ARM架构使用了不同的技术来保存返回地址,具体取决于异常模式。例如,在ARMv7-A架构中,当从非特权模式切换到异常模式时,返回地址会被保存在异常模式堆栈中的LR寄存器。而从用户模式切换到异常模式时,则使用异常向量表中的相应异常向量来获取返回地址。
总之,在异常处理程序中根据异常模式来计算返回地址是必要的,以确保正确返回到被打断的模式并继续执行。请注意,具体的实现可能会因不同的ARM内核和操作系统而有所不同。
在ARM64 V8架构的汇编代码(A.s)中,当通过ldr和br指令调用B.s中的接口时,如何在A.s中有效地保存和恢复程序计数器(SP)和链接寄存器(LR),以便于B.s执行完毕后能精确地返回到A.s的汇编源码
在ARM64架构的V8-AVX汇编代码中,当你需要从`A.s`通过`ldr`和`bl`(branch and link,相当于函数调用)指令调用`B.s`中的接口时,通常会按照以下步骤处理SP(程序计数器)和LR(链接寄存器):
1. **保存程序计数器** (SP):
使用`stp`指令(存储处理器状态寄存器,包括SP和其它必要数据)来保存SP和可能需要的数据,例如:
```asm
stp x30, x29, [sp, -16] // SP指针和LR将被保存到当前栈帧的底部
```
这里`x30`通常是SP,`x29`是LR的备份。
2. **设置链接寄存器** (LR):
在`BL`指令之前,你需要设置LR指向`B.s`的入口地址:
```asm
add x29, sp, #8 // 计算出函数B.s的地址,然后加8得到正确的入口地址(因为BL指令跳转到下一个指令)
bl B.s // 调用B.s
```
3. **B.s执行后恢复控制流**:
当`B.s`执行完并返回时,由于`blr`(link and branch register)指令会在执行结束后自动把LR的内容(保存的返回地址)加载回PC(程序计数器),所以`A.s`可以继续执行,无需额外操作。
4. **返回时恢复SP**:
`B.s`执行完毕后,如果需要在返回时恢复到`A.s`的后续代码,可以在适当的位置使用`ldp`指令恢复SP和可能需要的其他值:
```asm
ldp x30, x29, [sp], #16 // 从保存位置恢复SP和LR
```
记得在`B.s`结束前添加适当的`ret`(return)指令,它会自动清理栈并返回到原来的地址(即LR保存的地址)。
阅读全文