ARM架构与编程学习(二)(ARM架构(地址空间_RISC与CISC,ARM内部寄存器,ARM汇编,ARM汇编模拟器VisUAL,内存访问指令,数据处理指令,跳转指令))

地址空间_RISC与CISC

ARM中怎么访问寄存器?就像访问内存一样

怎么访问寄存器?用指针:

unsigned int *p  = 0x40010800; // p等于某个寄存器的地址

*p = val;   // 写这个地址,也就是写这个寄存器
val = *p;  // 读寄存器
int   a;  
unsigned int *p  = &a;   // p等于“a的地址”

*p = val;   // 写这个地址,就是写a
val = *p;   // 读这个地址,就是读a

在ARM CPU看来,内存,IO的操作是一样的

 

 在X86架构中内存和IO是分开的

 RISC

ARM芯片属于精简指令集计算机(RISCReduced Instruction Set Computing),它所用的指令比较简单,有如下特点:

① 对内存只有读、写指令

② 对于数据的运算是在CPU内部实现

③ 使用RISC指令的CPU复杂度小一点,易于设计

对于左图所示的乘法运算a = a * b

RISC中要使用4条汇编指令:

① 读内存a

② 读内存b

③ 计算a*b

④ 把结果写入内存

CISC

x86属于复杂指令集计算机(CISCComplex Instruction Set Computing)

它所用的指令比较复杂,比如某些复杂的指令,它是通过“微程序”来实现的。

比如执行乘法指令时,实际上会去执行一个“微程序”,

在“微程序”里,

一样是去执行这4不操作:

① 读内存a

② 读内存b

③ 计算a*b

④ 把结果写入内存

但是对于程序员来说,

他看不到“微程序”,

他好像用一条指令就搞定了这一切!

RISC和CISC比较

CISC的指令能力强,单多数指令使用率低却增加了CPU的复杂度,指令是可变长格式;
RISC的指令大部分为单周期指令,指令长度固定,操作寄存器,对于内存只有
Load/Store操作CISC支持多种寻址方式;
RISC支持的寻址方式CISC通过微程序控制技术实现;
RISC增加了通用寄存器,硬布线逻辑控制为主,采用流水线CISC的研制周期长RISC优化编译,有效支持高级语言

好的!我用生活化的比喻帮你理解CISC和RISC的区别:


CISC(复杂指令集)​
👉 像一个瑞士军刀

  • 功能多(一条指令能完成复杂操作,比如直接操作内存数据),但很多功能不常用。
  • 设计复杂(刀上各种小工具互相干扰,增加制造难度),研发周期长。
  • 操作步骤不固定(指令长度可变,像不同大小的快递包裹,分拣起来麻烦)。
  • 支持多种“找东西”方式(寻址方式),比如直接算地址、间接找地址等。
  • 控制原理像“说明书”(微程序控制:用预先写好的代码解释复杂指令)。

典型代表:Intel的x86架构(家用电脑CPU)。


RISC(精简指令集)​
👉 像一个高效流水线工厂

  • 只保留最常用的功能(指令简单,大部分1个时钟周期完成),比如操作寄存器,内存只能通过专门的Load/Store指令访问。
  • 设计简单(指令长度固定,像统一规格的零件,流水线处理超快)。
  • 支持少数高效的“找东西”方式(寻址方式少,比如直接算地址)。
  • 控制原理像“自动化流水线”(硬布线逻辑:电路直接执行指令,速度快)。
  • 编译器优化强(像智能流水线调度员,能帮高级语言生成高效代码)。

典型代表:ARM架构(手机/平板芯片)、RISC-V(新兴开源架构)。


对比总结

场景 CISC RISC
指令复杂度 复杂,能直接操作内存 简单,只能操作寄存器
设计理念 "多功能但笨重" "少而精,追求速度"
适用场景 传统PC(需要兼容复杂指令) 移动设备、嵌入式(省电高效)
现代发展 二者界限模糊(比如Intel也用流水线)

打个比方:
CISC像老教授——知识渊博但反应慢;
RISC像体育生——专注几个动作,但速度爆发力强!

这张图描述了 CPU 与各种外设或存储器之间是如何通过“地址”联系起来的。可以把它理解成:

  1. CPU 拥有一个统一的“地址空间”(图中右边标注了 0~4GB):

    • 对 32 位 CPU 来说,所有的地址都在这 4GB 范围内。
    • 不管是访问内存、访问 eMMC/Flash 还是访问其他外设(UART、USB 控制器),在 CPU 看来都是在读写某个“地址”
  2. 内存控制器(Memory Controller) 就像一个“交通枢纽”或“分配中心”:

    • 当 CPU 发出对某个地址的访问请求时,内存控制器会根据地址范围来决定,这次访问到底应该路由到内存、还是 eMMC、还是其他外设
    • 例如:
      • 如果地址在某个区间(比如 0x8000_0000 ~ 0x8FFF_FFFF),就映射到内存;
      • 如果地址在另一个区间(比如 0x9000_0000 ~ 0x9FFF_FFFF),就映射到 eMMC;
      • 再比如 0x1000_0000 ~ 0x1000_FFFF 可能映射到 UART 寄存器;
      • …等等。
  3. eMMC / Flash / 外设(UART、USB 控制器) 只是在地址空间中占了一部分区域:

    • CPU 通过读写对应地址,就能控制或获取这些外设的数据。
    • 从 CPU 的角度看,它只是在访问一段内存地址;
    • 实际上,访问请求被内存控制器转发给了真正的硬件(eMMC、UART、USB 等等)。
  4. 为什么说“父”是 CPU 的地址空间,“子”是 eMMC、Flash 等?

    • 可以理解为:CPU 的地址线是“父级”,而各种硬件设备是“子级”
    • 这些硬件都挂在 CPU 的地址总线上,不同的地址段对应不同的硬件。
    • CPU 只认地址,不直接知道具体是哪块硬件——由内存控制器来“做翻译”和“分配”。

通俗比喻

  • 想象 CPU 是一个人,他只有一个“电话本(地址空间)”,里面记录了 0~4G 的号码(地址)。
  • 内存控制器 像一个“电话总机”或“前台”,当 CPU 拨打某个号码(读写某个地址)时,前台决定把这通电话接到“内存”部门,还是“eMMC”部门,还是“UART”部门。
  • 对 CPU 而言,他只知道“我在打某个号码”,并不知道背后是具体哪位接电话(哪块硬件响应)。
  • 最终,不同号码对应了不同硬件,就像不同分机
  • CPU 只有一套统一的 4GB 地址空间(因为是 32 位)。
  • 内存控制器 负责把不同地址段映射到不同硬件(内存、eMMC、Flash、UART、USB 控制器等)。
  • 对 CPU 来说,读写某个地址就是读写某块硬件;对硬件来说,只在特定地址段上做出响应。
  • 这就是嵌入式系统中常见的“总线 + 地址映射”机制

eMMC 就是一块把 Flash 存储和控制器封装在一起的“小硬盘”,系统只需用标准协议去读写它,既省空间又减少软件开发难度,广泛用于手机、平板等嵌入式设备。

ARM内部寄存器

RISC

ARM芯片属于精简指令集计算机(RISCReduced Instruction Set Computing),它所用的指令比较简单,有如下特点:

① 对内存只有读、写指令
② 对于数据的运算是在CPU内部实现
③ 使用RISC
指令的CPU复杂度小一点,易于设计

对于左图所示的乘法运算a = a * b
在RISC
中要使用4条汇编指令:

① 读内存a
② 读内存b
③ 计算a*b
④ 把结果写入内存

问题:在CPU内部,用什么来保存aba*b

无论是cortex-M3/M4,还是cortex-A7
CPU内部都有
R0R1……R15寄存器;
它们可以用来“暂存”数据。

对于R13R14R15,还另有用途:
R13:别名
SP(Stack Pointer),栈指针
R14:别名
LR(Link Register),用来保存返回地址
R15:别名
PC(Program Counter),程序计数器,表示当前指令地址,写入新值即可跳转

M3/M4/A7 CPU内部寄存器

好的!我用生活化的比喻来解释这张图中的寄存器结构,保证你5分钟就能看懂:


1. 寄存器银行 = 快递柜 + 急救包

想象你的手机/电脑里有一个「超级快递柜」,柜子分成不同颜色的格子​(对应不同处理器模式)。每个格子里的快递盒(寄存器)有的通用​(比如R0-R7),有的专用​(比如R15是程序计数器),还有的格子放了「急救包」(特殊寄存器CPSR/SPSR)。


2. 为什么要分这么多模式?

👉 就像你生活中不同场合用不同工具:

  • 用户模式(User)​:日常搬砖模式,只能用普通快递盒(R0-R15),权限低。
  • 中断模式(IRQ/FIQ)​:突然有紧急电话(比如你按了音量键),系统立刻切换到「中断快递柜」,用专属快递盒(R8_fiq/R9_fiq等),避免和日常搬砖的数据搞混。
  • 超级用户模式(SVC)​:管理员模式,能调用高级权限(比如安装App)。
  • 其他模式(ABT/UND等)​:类似「应急通道」,处理程序崩溃、未知指令等意外。

3. 重点看「FIQ快递柜」的特殊设计

快速中断模式(FIQ)的格子最特别:

  • 专属快递盒:R8_fiq到R14_fiq,专门给紧急任务用。
  • 不排队:普通中断(IRQ)要和其他程序抢快递盒,FIQ直接用自己的,响应速度更快。
  • 类比:普通快递员要排队进小区,FIQ快递员有专属通道,随叫随到!

4. 底部的「急救包」是做什么的?

特殊寄存器CPSR和SPSR就像「急救包」:

  • CPSR:记录当前状态(比如你是用户模式还是中断模式)。
  • SPSR_xxx:每次切换模式时,把原来的状态存档(比如从用户模式切到IRQ模式,存档用户模式的CPSR到SPSR_irq)。
  • 类比:你突然被叫去开会,先拍一张工位照片存档(SPSR),回来时按照片恢复现场。

终极总结

组件 生活比喻 作用
R0-R12 通用快递盒 日常搬砖存数据
R13(SP) 临时货架管理员 记录当前货架(栈)的位置
R14(LR) 返程机票 记录执行完任务后要回哪里
R15(PC) 任务清单指针 指向下一条要执行的指令
CPSR/SPSR 工位状态存档照片 保存和恢复处理器状态

一句话理解
处理器像一家快递公司,不同场景(模式)用不同的快递柜(寄存器),紧急任务(FIQ)有专属通道,急救包(CPSR)随时存档恢复现场,保证高效不乱套!

 M3/M4比较两个数是,结果并保存在哪里

对于cortex-M3/M4,还要一个Program Status Register

 M3/M4:xPSR实际上对应3个寄存器APSR/IPSR/EPSR

对于cortex-M3/M4来说,
xPSR实际上对应
3个寄存器:
① APSR
Application PSR,应用PSR
② IPSR
Interrupt PSR,中断PSR
③ EPSR
Exectution PSR,执行PSR
这3
个寄存器的含义如右图所示

这3个寄存器,可以单独访问:
MRS  R0, APSR  ;读
APSR
MRS  R0, IPSR    ;读
IPSR
MSR  APSR, R0   ;写
APSR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值