news 2026/2/16 0:18:52

PC 指针为何不等于执行地址?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PC 指针为何不等于执行地址?

一、先明确两个核心概念

执行地址:CPU 当前正在"执行(Execute)"的指令地址(如正在运算的ADD指令地址)

PC 指针:CPU 下一个要"取指(Fetch)"的指令地址(告诉 CPU 下条指令在哪)

PC 天然指向"执行地址的后面",差异仅在于偏移多少——由流水线和架构决定。

二、根本原因:流水线 + 架构规范

1. 流水线机制:并行执行的必然结果

ARM 用 3 级流水线(取指→译码→执行)实现指令并行:当指令 A(执行地址)在执行时,指令 B 在译码,指令 C 在取指,PC 此时指向指令 C 的地址。

例:经典 ARM(32 位指令)中,执行地址0x00(A)→ PC0x08(C),偏移 +8;但 Cortex-M3/M4 有额外规范。

2. 架构规范:Cortex-M3/M4 的"强制偏移"

Cortex-M3/M4 仅支持 Thumb/Thumb-2 指令集(16/32 位指令),ARMv7-M 架构强制规定:无论指令是 16 位还是 32 位,PC = 执行地址 + 4。

执行 16 位指令(地址0x00)→ PC0x04

执行 32 位指令(地址0x00)→ PC0x04

目的是简化开发:无需判断指令长度,偏移规则统一。

三、Cortex-M3/M4 实战:正确获取执行地址

1. 手动计算:PC - 4

因PC = 执行地址 + 4,减 4 即得真实执行地址:

; 获取当前执行地址,存入R0

GetCurrentAddr:

MRS R0, PC ; R0 = PC(执行地址+4)

SUB R0, R0, #4 ; R0 = 执行地址(正确)

BX LR

2. 用伪指令:避免手动算偏移

日常开发优先用ADR/LDR =label,编译器自动处理 PC 偏移:

ADR R0, DataBuf ; 短距离:自动生成PC相对寻址(修正偏移)

LDR R1, =ConfigAddr ; 长距离:从字面池读地址(无需关心PC)

DataBuf: DCD 0x11223344

ConfigAddr: DCD 0x00001234

四、3 个必避误区

误区 1:按指令长度算偏移(16 位 +2、32 位 +4)→ 错!Cortex-M 强制 +4

误区 2:混用架构规则(把经典 ARM 的 +8 套到 Cortex-M)→ 错!Cortex-M 只 +4

误区 3:手动算偏移不用伪指令→ 错!ADR/LDR =label更稳定,避免代码修改后偏移失效

五、总结

PC≠执行地址,是 ARM"效率(流水线并行)"与"易用性(架构规范)"的平衡结果。对 Cortex-M3/M4 开发者,只需记住:

PC = 执行地址 + 4

获取执行地址用PC-4

日常用伪指令处理地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 19:06:44

解读SAE/USCAR-2

🔬 SAE/USCAR-2 标准核心解读 1. 标准定位与范围 SAE/USCAR-2标准主要针对汽车电子连接器系统,规定了从开发、生产到现场分析全阶段的严格测试要求,以确保其电气和机械性能在车辆全生命周期内的可靠性。 主要适用对象:嵌入式、端…

作者头像 李华
网站建设 2026/2/10 18:09:05

我已经完全爱上沃玛了!

我已经完全爱上沃玛了!我已经完全爱上沃玛了!我已经完全爱上沃玛了!我已经完全爱上沃玛了!我已经完全爱上沃玛了!我已经完全爱上沃玛了!我已经完全爱上沃玛了!我已经完全爱上沃玛了!…

作者头像 李华
网站建设 2026/2/6 23:50:04

从微信红包延迟看超级应用高并发下的数据一致性攻坚

从微信红包延迟看超级应用高并发下的数据一致性攻坚 相信不少人都有过这样的经历:逢年过节在微信群发红包,明明点击了发送,却迟迟看不到红包出现在聊天界面;或者领取红包后,零钱余额没有即时更新,刷新好几…

作者头像 李华
网站建设 2026/2/11 19:21:46

Ink/Stitch 开源刺绣设计软件:免费教程与完整使用指南

Ink/Stitch 开源刺绣设计软件:免费教程与完整使用指南 【免费下载链接】inkstitch Ink/Stitch: an Inkscape extension for machine embroidery design 项目地址: https://gitcode.com/gh_mirrors/in/inkstitch 还在为昂贵的专业刺绣软件发愁吗?I…

作者头像 李华
网站建设 2026/2/7 3:27:26

3G期末考核题解

一、144.二叉树的前序遍历这是一道经典的二叉树前序遍历,我们用两种方法来解决。1. 递归法:树的中序遍历口诀:根左右int* preOrder(struct TreeNode* root, int* arr, int* size) {if (root NULL) {return NULL;}arr[(*size)] root->val…

作者头像 李华
网站建设 2026/2/8 2:27:54

FlashAI Vision终极指南:企业级私有化多模态AI完整方案

FlashAI Vision终极指南:企业级私有化多模态AI完整方案 【免费下载链接】flashai_vision 项目地址: https://ai.gitcode.com/FlashAI/vision 在数据安全日益重要的今天,企业面临着一个关键挑战:如何在保证数据隐私的同时,…

作者头像 李华