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

news/2025/11/2 22:34:43/文章来源:https://www.cnblogs.com/lsksp/p/19185561

ARM 嵌入式开发中,直接读 PC(R15)获取"当前执行指令地址"必出错——执行地址0x08000100时,PC 可能是0x08000104(Cortex-M3/M4)或0x08000108(经典 ARM)。核心原因只有两个:流水线并行执行架构规范固化,以下聚焦 Cortex-M3/M4讲透关键。

一、先明确两个核心概念

  • 执行地址: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. 误区 1:按指令长度算偏移(16 位 +2、32 位 +4)→ 错!Cortex-M 强制 +4
  2. 误区 2:混用架构规则(把经典 ARM 的 +8 套到 Cortex-M)→ 错!Cortex-M 只 +4
  3. 误区 3:手动算偏移不用伪指令→ 错!ADR/LDR =label更稳定,避免代码修改后偏移失效

五、总结

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

  • PC = 执行地址 + 4
  • 获取执行地址用PC-4
  • 日常用伪指令处理地址

无需深究流水线细节,按规则用即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VIM使用教程

介绍常用VIM命令。VIM使用 一、移动 1.1单个字符移动按键 功能h 左移j 下移k 上移l 右移1.2 行首尾移动按键 功能0/g0 移动到本行开头/g 移动到本行第一个字符\(/g\) 移动到结尾1.3 单词之间移动按键 功能b/e 单词开头…

sqli-labs_less8 布尔盲注脚本

在我大一第一个寒假,从纯小白入门时在高铁上激情写出来的,适合新手学习,逻辑很简单,能锻炼你的初步代码能力和对sql注入的理解与利用,写完会有很大的成就感,make you confident import requests import stringur…

ST产品型号解析

提供ST产品型号命名方式STM32 & STM8 产品型号STM32MPU产品型号

【Shell脚本】 目录清理脚本

以下是一个满足需求的 Linux 自动化监控与执行脚本,包含详细注释和容错处理,可直接部署使用。脚本完整代码(opt_monitor_cleanup.sh)#!/bin/bash ##############################################################…

第一次团队作业

第一次团队作业 1.团队名称和这个名称的原因 2.团队姓名和学号学号 姓名3123003122 齐思贤3123004192 彭文昊3123002353 袁镇清3123002127 谢嘉骏31230042203 张嘉铭3123004185 林旭坚3223004639 阿丽亚阿不来海提3.团…

题解:CF1975E Chain Queries

题意 给定一棵 \(n\) 个结点的树,第 \(i\) 个点有颜色 \(c_i\),其中 \(c_i=0\) 为白色,\(c_i=1\) 为黑色。有 \(q\) 次询问,每次询问给定一个正整数 \(u\),要求将结点 \(u\) 的颜色反转,并判断修改后的树上的所有…

题解:P4895 独钓寒江雪

题意 给定一棵无根树,求其中本质不同的独立集的个数。 思路 首先,由于要求统计独立集的个数,所以我们选定的点不能相邻。考虑 dp,设 \(f_{i,0}\) 表示 \(i\) 的子树内不选 \(i\) 的独立集个数,\(f_{i,1}\) 表示 \…

题解:P7201 [COCI 2019/2020 #1] Džumbus

题意 简化版题意:给定一个森林,所有节点初始为白色,可以花费 \(D_i\) 将第 \(i\) 个节点染成黑色。定义一个节点如果是黑色节点,且与它直接相连的点中有黑色节点,则这个点是“好的”。有 \(Q\) 个询问,每次询问在…

题解:CF913D Too Easy Problems

首先,显然不得分的题目不做,因为这样不仅增加时间,还可能导致一些原来符合限制的题目不符合限制,不能使答案更优。 于是,我们发现最终的答案 \(ans\) 不会超过所选题目中最小的 \(t_i\),所以我们选题时应该尽量选…

题解:CF875C National Property

大致题意:给定一些字符串,字符串中的字母开始时均为小写,你可以将其中若干种字母全部改为大写,问能否使得操作后给定的字符串满足按字典序升序(可以等于)排列。如果能,则输出方案。 这里提供一个拓扑排序的解法…

题解:CF1037E Trips

题意 一共有 \(n\) 个人,他们开始互不认识,而每天早上不认识的两个人会变成朋友。一共有 \(m\) 天,每天晚上有的人要去旅行,去旅行的人必须满足有至少 \(k\) 个朋友也去旅行。求每天去旅行的最大人数。 思路读题后…

lecms在使用redis中设置他缓存时间

lecms在使用redis中设置他缓存时间,默认的都是永久缓存,如果数据过大,会导致内存损耗太严重,所以要修改他缓存时间,比如我设置为缓存24个小时,即为86400秒 第一步:找到lecms/xiunophp/cache/cache_redis.class.…

题解:CF387E George and Cards

首先思路是很清晰的,该删的数从小到大开始删,这样在删到当前数的时候,比当前数小的数可以尽量少,能选的区间自然就更大了。 考虑如何实现,维护一个 set,从小到大遍历每个数,若当前数不需要被删除,就将其下标加…

博客一年纪

题记:千里之行,始于足下从想写 UEFI Blog 到真的发布我第一篇 Blog 当中隔了 “好些年” 第一篇 UEFI Blog - UEFI 笔记 001 — 什么是 ACPI method今天打开 Blog 突然发现,从第一篇 UEFI Blog 到现在(又)已经过去…

题解:AT_abc307_f [ABC307F] Virus 2

思路 考虑模拟传染过程,对于每一个已经被感染的点(下文称为当前点),遍历其能到达的点(下文称为新点),记这条边的边权为 \(w\),分为以下两步:判断新点能否和当前点在同一天内被感染;若不能,则从当前点被感染…

题解:CF291E Tree-String Problem

题意 给定一棵树,树的边上有字符串,字符串可以按照由父亲到儿子的方向拼接,求模式串 \(t\) 出现的次数。 思路 直接使用哈希。提前预处理出模式串 \(t\) 对应的哈希值,在搜索时计算当前点到儿子之间的边上的字符串…

java操作sip

1|0一、基础理论介绍 1|11.1 sip的主要功能 SIP的主要功能是允许用户或设备通过消息传递来产生互动,这些消息可以满足以下四种目的:用户向系统注册; 邀请用户参加互动会议; 协商会议媒体内容的格式; 建立两端点或…

CH59X/CH58X蓝牙主机设置白名单

可以通过白名单只扫描、连接特定的蓝牙设备(白名单中列出的)。 一、首先将白名单使能,通过宏开启// TRUE to use white list during discovery #define DEFAULT_DISCOVERY_WHITE_LIST 1//FALSE// TRUE to us…

题解:CF712D Memory and Scores

题意 有两个整数 \(a,b\),进行 \(t\) 轮操作,每轮操作先在 \([-k,k]\) 范围内取一个整数加到 \(a\) 中,再在 \([-k,k]\) 范围内取一个整数加到 \(b\) 中,求最终使 \(a > b\) 的方案数。 思路 记 \(a\) 增加的总…

思维的断章,觉知的永恒:一个基于“内观照叙事模型”的认知革命与跨学科范式重构

思维的断章,觉知的永恒:一个基于“内观照叙事模型”的认知革命与跨学科范式重构 笔者:岐金兰 日期:2025年11月2日 摘要 本文基于《一个灵感:思维的断章——内观照中的叙事》所提出的“觉知背景场思维模型”,进行…