内核寄存器PC、SP、LR之间的关系,大白话解释

PC(Program Counter 程序计数器):R15,存储下一个将要执行的指令的地址。每执行完一条指令后,PC寄存器的值会递增,指向下一条指令的地址。这种递增通常与指令的长度有关(例如,在32位系统中,通常是4字节)。

SP(Stack Pointer 堆栈指针):R13,SP始终会指向栈的下一个空闲空间的地址,用于存储函数的返回地址

当一个函数被调用时,当前的程序计数器(PC)值(即调用后的下一条指令地址)通常被压入堆栈,以便在函数执行完毕后能够返回到正确的位置继续执行。这个操作是通过将PC值推送到SP指向的内存地址来完成的,然后SP的值通常会递减,指向堆栈中的下一个空闲位置。

函数执行完毕后,需要恢复调用前的执行环境。这包括从堆栈中弹出之前保存的寄存器值和返回地址。SP的值会递增,指向包含返回地址的堆栈位置,然后返回地址被加载到PC寄存器,程序继续执行。

在嵌套函数调用(一个函数中调用另一个函数)的情况下,SP需要正确地保存每一层的返回地址和寄存器状态,以确保每一层都能正确返回。

LR(Link Resigter 链接寄存器):R14,用于保存子程序或者是中断的返回地址,使得子程序执行完后程序可以返回到原有的调用点继续执行。

so,👇👇👇

SP与LR与PC之间的关系:

PC记录的是下一个将要执行的指令的地址、而程序需要调用子程序时,计算机会把PC中的地址传给LR寄存器,用于保存调用点地址,然后程序就跳转到子程序地址中执行,执行完后,计算机会读出LR寄存器中的地址传给PC,也就是返回到调用点,程序继续往下执行。而当有多个子程序嵌套时,没进入到一个子程序,就会把上一层的调用点地址写入LR寄存器,但是这样带来的问题是,上上一层的调用点的地址就会被覆盖 ,所以这时候LR寄存器上一层的调用点的地址入栈,之前保存在堆栈中的返回地址也不会丢失。这个入栈的行为就要用到SP,SP始终会指向栈的下一个空闲空间的地址,在多层嵌套调用中,每一层的子程序都会在入口处将LR寄存器的值压入堆栈,并在出口处从堆栈中弹出返回地址到LR寄存器。这样,即使LR寄存器被覆盖,程序也能通过堆栈中的值正确返回到上一层程序。可以回到最初的调用点,多层嵌套的恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值