硬汉嵌入式论坛

 找回密码
 立即注册
查看: 390|回复: 7
收起左侧

[技术讨论] 关于ARM异常下LR的值

[复制链接]

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2025-8-28 10:37:28 | 显示全部楼层 |阅读模式
本帖最后由 Lighting风 于 2025-8-28 10:41 编辑

最近在分析ARM异常下的压栈的时候遇到这样一个问题,首先压栈的时候会自动的把LR寄存器的值压入栈中,我调试打印了一下,LR寄存器会先被更新为"异常恢复后的下一条指令的地址",然后压入栈中。那请问假设LR寄存器原先有值的话 岂不是会丢了吗

1.jpg
可以看到保存的LR的值是下条指令的地址 那么原来的LR寄存器的值呢?就这么丢了吗
2.jpg
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-8-28 11:46:46 | 显示全部楼层

ARM异常下LR寄存器的值的保存与恢复

最近在分析ARM异常下的压栈的时候遇到这样一个问题,首先压栈的时候会自动的把LR寄存器的值压入栈中,我调试打印了一下,LR寄存器会先被更新为"异常恢复后的下一条指令的地址",然后压入栈中。那请问假设LR寄存器原先有值的话 岂不是会丢了吗
1.jpg


可以看到保存的LR的值是下条指令的地址 那么原来的LR寄存器的值呢?就这么丢了吗

2.jpg
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-8-28 14:13:03 | 显示全部楼层

回帖奖励 +4 个金币

Lighting风 发表于 2025-8-28 11:46
最近在分析ARM异常下的压栈的时候遇到这样一个问题,首先压栈的时候会自动的把LR寄存器的值压入栈中,我调试 ...

举个例子,比如多级子函数调用,之前的LR都是上一级调用前入栈的。
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-8-28 20:10:06 | 显示全部楼层
可是在异常发生的时候 入栈的LR的值并不是原始值,而是""异常恢复后的下一条指令的地址",那么最开始的LR的值存到哪里了呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-8-28 20:33:18 | 显示全部楼层
Lighting风 发表于 2025-8-28 20:10
可是在异常发生的时候 入栈的LR的值并不是原始值,而是""异常恢复后的下一条指令的地址",那么最开始的LR的 ...

我确认下,你说的原始值是指的这个吧,如果是这个不用担心,他退出异常中断,不需要直接恢复成你这个值,只有再次返回到上一级调用,正确的pop出栈值给他返回就行了。

1234.png
回复

使用道具 举报

85

主题

801

回帖

1056

积分

至尊会员

积分
1056
发表于 2025-8-28 22:07:49 | 显示全部楼层

回帖奖励 +4 个金币

在栈里面呀
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-8-29 09:28:55 | 显示全部楼层
哦好的了解了 感谢
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-8-30 19:13:23 | 显示全部楼层
这段代码运行的是0地址函数,会触发HardFault_Handler,即异常,于是压栈由硬件执行,不需要软件参与,所以汇编中没有压栈的指令
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 11:21 , Processed in 0.057259 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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