OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4170|回复: 1

对于连接寄存器LR在函数调用和异常返回中作用的疑问

[复制链接]

6

主题

19

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-9-10
在线时间
0 小时
发表于 2014-3-22 16:59:06 | 显示全部楼层 |阅读模式
今天看uCOS任务切换的汇编代码,在PendSV异常中任务代码最后一行:
BX      LR                                           ; Exception return will restore remaining context 
; 如果是从异常返回到线程状态,则使用新的PSP 的值作为栈顶指针 
这里我的理解是从新任务的堆栈中取出R14(即LR的值),然后PC指向新的代码地址。
总结之:堆栈中新LR值弹出给LR寄存器——LR值给PC——程序跳转

而普通函数调用时:
main                                                    ;主程序
.
BL function1                                        ;调用function1
.
function1
.
BX LR                                                ;函数返回
如果是没有嵌套调用的话,LR中存储的就是函数应该返回的地址,然后将该值直接赋给PC
总结之:LR值给PC——程序跳转
那么普通调用与异常返回时BX LR的区别是异常返回需要从堆栈中弹出已保存的LR的值到LR寄存器,然后才能跳转,而普通函数调用则是直接跳转,
不知我这么理解对不对?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2014-3-22 23:21:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 12:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表