2. ARM处理器概论

分清两个核心:PC寄存器存的是【地址】,不是普通数据值💡

1. 一句话定死:PC = 存放「指令内存地址」的寄存器

CPU要去内存哪个位置取指令 ,全看PC里存的地址数字

内存格子编号=地址(0x2004、0x2008......),格子里装的才是指令/数据(值)。

PC永远存格子编号(地址),不存格子里的内容。

2. 拿 0x2007 举例拆解

  1. 你写入PC的数字:0x2007(这是你想要跳转的目标地址)
    你代码:MOV PC,#0x2007 → 你以为:去内存编号0x2007的格子拿指令
  2. ARM硬件规则生效:砍掉bit1:0,丢弃低2位
    0x2007 → 抹掉末尾2bit → 0x2004
  3. 最终生效:CPU实际访问地址 = 0x2004
    CPU无视你给的0x2007,强行去地址0x2004的内存取指令。

关键:

  • 0x2007你代码给PC的目标地址(无效地址,ARM指令不能放这)
  • 0x2004硬件修正后、CPU真实访问的有效地址

0x2005/0x2006/0x2007 这3个地址:ARM模式下不允许存放指令,只有0x2004、0x2008能存ARM指令,硬件自动兜底修正地址。

3. 区分【地址】和【存储的值】极简比喻

  • 地址 = 房间门牌号(0x2004)
  • 值 = 房间里面放的东西(ARM机器指令)
  • PC:专门记门牌号的小本本

你在本本上写门牌2007号,但ARM规定:只有门牌是4倍数的房间才有指令 ,2005/2006/2007是空房间,门卫(硬件)直接把门牌改成2004,CPU去2004房间拿指令。

4. 正确用法

想跳到地址0x2004 取指令 → 代码就给PC赋值0x2004,低位bit1:0=00,硬件不修改,正常跳转。


补充:bit31:2、bit1:0再简化

PC一共32位:

  • bit31~bit2真正用来生成有效地址的位(门牌号主体)
  • bit1~bit0无效位,不管填0/1,硬件直接扔掉作废(门牌末尾两位不算数)
相关推荐
2401_862880826 小时前
ARM 嵌入式开发 ---知识点
arm开发·嵌入式硬件·物联网
AAA代码批发商8 小时前
DAY43 ARM 体系结构学习笔记|嵌入式入门,从硬件组件到流水线、内存与栈帧
arm开发·笔记·学习
女神下凡9 小时前
带NPU的电脑 和不带NPU的电脑 在使用上有什么不样
arm开发·单片机·pcm
T1mzhou1 天前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
Doraemomo1 天前
IMX6ULL裸机开发——系统主频和时钟配置
arm开发·嵌入式硬件·makefile·imx6ull
T1mzhou1 天前
ARM64 平台安全学习记录
linux·服务器·arm开发·arm
云栖梦泽1 天前
网络设备驱动(1)
linux·arm开发·嵌入式硬件
零依赖极客2 天前
Day 9·1 KV 也量化——q8 KV 把缓存与 decode 带宽压到一半
c语言·开发语言·arm开发·人工智能·缓存·矩阵
secondyoung3 天前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
奔跑的架构师3 天前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm