当前位置: 首页 > news >正文

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

日常用伪指令处理地址

http://www.cnnetsun.cn/news/41659.html

相关文章:

  • 新型基础设施运维(Infratech + GIS):一场被低估的结构性变革
  • 软件测试面试题个人总结
  • OpenWrt智能路由终极指南:如何实现多线路带宽叠加
  • bibliometrix:科学文献分析的终极指南与快速上手教程
  • React JSON Schema Form终极指南:3步构建专业表单应用
  • 低价游陷阱专坑老年人?
  • Hazel引擎揭秘:如何用开源技术打造高性能2D/3D游戏开发平台
  • Spark-TTS方言合成实战:零样本实现普通话到多地域口音转换
  • cjdns网络服务发现机制深度解密:构建加密网络中的智能寻址系统
  • 【无标题】激活函数应该具有哪些特征
  • 深入解析Oracle SQL调优健康检查工具(SQLHC):从原理到实战优化
  • 5分钟上手shUnit2:Shell脚本单元测试终极指南
  • uni-app新手避坑指南:从零开始搭建跨平台应用
  • 深入浅出 ES Module
  • wangEditor处理ppt动画效果转网页兼容
  • 深度残差网络在智能垃圾分类中的技术实践与性能分析
  • wangEditor导入MathType公式保留矢量格式
  • Node.js BFF层实战:对接天远综合多头借贷/逾期/欺诈聚合接口
  • Day11 >> 150、逆波兰表达式求值 + 239、滑动窗口最大值 + 347、前K个高频元素
  • System Informer 终极指南:从零掌握Windows系统监控神器
  • 20、集群节点与实例的添加和删除操作指南
  • 5大React动画库生态对比:从入门到精通的全栈解决方案
  • 2、Oracle Real Application Clusters (RAC):特性、成本与效益解析
  • Phi-2模型完全攻略:让27亿参数的小巨人成为你的AI助手
  • 30分钟掌握Tauri:用Rust构建你的第一个桌面应用
  • WeChatTweak-macOS开源项目深度参与指南
  • NootRX:让AMD RDNA 2显卡在macOS上完美运行
  • DBeaver崩溃救星:3步紧急恢复SQL脚本的完整方案
  • 项目效率翻倍,做对了什么?
  • 少儿编程考试路径规划:考级与竞赛时间如何平衡?