硬汉嵌入式论坛

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

[技术讨论] 关于PC指针的一点疑惑?

[复制链接]

9

主题

40

回帖

67

积分

初级会员

积分
67
发表于 2024-9-27 16:00:30 | 显示全部楼层 |阅读模式
大家好,我是一名初学者,想请教一个问题
stm32程序编译后map文件函数地址和函数实际运行地址不一致问题,为什么MDK编译出来的map文件任意一个函数的地址都是奇数,但是实际运行的时候,发现地址都是偶数?
看到这篇帖子,但是感觉讲的不是特别明白,有没有大神解惑一下?

stm32程序编译后map文件函数地址和函数实际运行地址不一致问题探究_stm32查看函数地址-CSDN博客


有几个问题:
1.实际下载到FLASH中的地址,到底是奇数还是偶数地址呢?
2. 这段话,“如果向PC中写数据,就会引起一次程序的跳转(但是不更新LR寄存器)。CM3中的指令至少是半字对齐的,所以PC的LSB总是读回0。然而,在跳转时,无论是直接写PC的值还是使用跳转指令,都必须保证加载到PC的数值是奇数(即LSB=1),用以表明这是在Thumb状态下执行。倘若写了0,则视为企图转入ARM模式,CM3将产生一个fault异常。这些可以总结为读PC指针时,返回LSB总是为0;写PC指针时,一定要保证LSB为奇数”。这句话是正确的吗。


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-9-27 16:34:49 | 显示全部楼层
这个lsb是用来指示thumb和arm状态的,M内核仅支持Thumb状态

124.png

然后这个代码存储位置问题

125.png
回复

使用道具 举报

9

主题

40

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2024-9-27 17:35:10 | 显示全部楼层
eric2013 发表于 2024-9-27 16:34
这个lsb是用来指示thumb和arm状态的,M内核仅支持Thumb状态

1.意思就是,其实写PC指针时,LSB都必须保持是1,指示是Thumb状态,如果PC指针被意外修改。写入的是一个偶数地址,就会进HardFault(原因是试图切换到ARM状态)。
2.“In high-level programming languages(includeing C,C++),the setting of LSB in branch targets is handled by the compiler automatically”,意思是我们平时在用C编程时,其实并没有过多关注过这个LSB的问题,都是编译器帮我们自动处理好了。如果我有一个函数是的地址是放在0x100的,但是最后汇编指令写入到PC指针时,其实是0x101?在启动文件xxx.s中,有一条指令是THUMB,网上的解释是表示后面的指令是THUMB指令集。意思是.s汇编文件,编译器不会自动帮我们处理。所以在内存中Vector的地址都是奇数。放入到PC指针才能是正确的?

我这两点理解是否正确呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-9-28 09:16:02 | 显示全部楼层
Yhlr 发表于 2024-9-27 17:35
1.意思就是,其实写PC指针时,LSB都必须保持是1,指示是Thumb状态,如果PC指针被意外修改。写入的是一个 ...

1223.png
回复

使用道具 举报

9

主题

40

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2024-9-29 09:46:45 | 显示全部楼层

感谢硬汉解惑!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 12:54 , Processed in 0.240233 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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