[信息] 你不得不掌握的ARM_汇编_基础知识

[复制链接]
357|0
paotangsan 发表于 2025-9-10 21:56 | 显示全部楼层 |阅读模式
STM32存储单元
STM32 的存储系统采用分级架构,按功能和特性可分为三大类:

1.CPU 直接控制存储单元:寄存器、缓存(Cache)
2.片内集成存储单元:RAM、Flash
3.可扩展外部存储单元:通过接口扩展的 SDRAM、QSPI Flash 等

CPU(中央处理器)
CPU是程序的执行者:从FLASH取指令,在RAM中处理数据

存储与处理:

     寄存器介绍:

1. 通用寄存器
特点:用途灵活,可存数据、地址、中间运算结果,不同架构命名 / 数量有差异(如 x86 的 EAX/EBX,ARM 的 R0 - R15 )。
典型场景:函数调用时传参、临时变量存储,像计算a + b,可把a b暂存通用寄存器,运算后存结果。


2. 专用寄存器

程序计数器(PC/IP):存放下一条要执行指令的内存地址 ,CPU 按其指向取指令,执行后自动更新(顺序执行 + 1、跳转则改写地址 ),决定程序 “下一步做什么”。
指令寄存器(IR):暂存当前正在执行的指令 ,供 CPU 解码、执行,是指令从内存到运算单元的 “中转站”(部分架构隐含,程序员难直接操作 )。
状态寄存器(PSR/EFLAGS):记录运算状态(如进位C、零Z、符号S标志 )、中断使能等信息,影响程序分支(if判断)、中断响应逻辑。
堆栈指针(SP):指向栈顶地址(RAM 里的堆栈区 ),配合PUSH/POP指令,保存函数调用上下文、局部变量,保证程序执行完能正确返回。
基址 / 变址寄存器:基址寄存器存数据内存起始地址,变址寄存器存相对偏移量,二者配合实现内存地址计算(类似数组索引,基址 + 变址定位元素 )。

      运算中间结果:执行算术运算(加减乘除)、逻辑运算(与或非)、位操作时的临时数据。

      控制信号:生成地址信号、读写控制信号,协调 RAM、Flash、外设之间的数据传输

RAM(随机存取存储器)
RAM是程序的工作台:管理栈堆、缓存

存储内容:

     运行中的程序代码:CPU 从 Flash 读取代码后,会将部分常用或正在执行的指令加载到 RAM 中,以加快执行速度。

     变量与临时数据:包括全局变量、局部变量、函数参数、堆栈数据(如函数调用时的临时存储)等。

     缓存数据:部分 STM32 型号的 RAM 会作为外设数据的缓存(如 ADC 采样结果、DMA 传输数据)。


Flash(闪存存储器)
FLASH是程序的家:存储代码、常量、向量表

存储内容:

     程序代码:用户编写的固件程序(如 C 语言编译后的机器码)永久存储在此,上电后 CPU 从 Flash 读取指令执行。

     常量数据:如字符串("Hello World")、静态数组、固件版本信息等无需运行时修改的数据

     配置信息:部分用户自定义的非易失性配置(如设备参数、校准值),可通过软件写入 Flash

RAM、Flash、CPU 协同工作流程简述
1. 上电复位与启动准备
电源稳定:电压达标后,CPU(如 Cortex-M 内核)检测复位信号,进入复位状态,寄存器清零。
启动模式选择:通过 BOOT0/BOOT1 引脚确定启动源(默认从内部 Flash 启动)。

2. 从 Flash 加载初始化代码
读取启动向量:CPU 从 Flash 的 0x08000000 地址获取栈顶指针(SP),从 0x08000004 获取复位函数地址,跳转至启动文件(startup.s)
初始化 RAM:
将 Flash 中初始化的全局变量(数据段)复制到 RAM。
清零 RAM 中未初始化的全局变量(BSS 段)。

3. 系统启动与程序运行
时钟与外设初始化:启动文件调用SystemInit()配置系统时钟(如倍频)和外设时钟使能。
进入用户程序:跳转至main()函数,CPU 从 Flash 读取指令执行,变量在 RAM 中动态读写(如局部变量存于栈区,全局变量存于数据段)。

4. 运行时数据交互
CPU 控制流:从 Flash 取指令,在 RAM 中操作数据(如变量运算、函数调用时参数压栈)。
关键特性:
Flash 非易失性存储程序,掉电不丢失;RAM 易失性但读写速度快,支撑实时运算。

2035268c0f7b796555.png

涉及到的基础汇编指令
1.LDR(Load Register)
      功能:从存储器加载数据到寄存器。
      示例:LDR R0, [R1] // 从 R1 指向的内存地址读取数据到 R0。
      场景:从 RAM/Flash 读取变量值到寄存器。

2.STR(Store Register)
      功能:将寄存器数据存储到存储器。
      示例:STR R0, [R1] // 将 R0 的值写入 R1 指向的内存地址。
      场景:将计算结果从寄存器写回 RAM。

3.MOV(Move)
      功能:寄存器间数据传输或立即数赋值。
      示例:MOV R0, #10 // 将立即数 10 存入 R0。
      场景:初始化寄存器值

4.PUSH/POP(入栈/出栈)
      功能:将寄存器值压入 / 弹出堆栈(SP 指针自动调整)。
      示例:PUSH {R4-R7} // 将 R4~R7 压栈,用于保存局部变量。
                 写(PUSH):把寄存器值 “压” 到 SP 指向的 RAM 堆栈空间(SP 先减、再写 )
                 读(POP):从 SP 指向的 RAM 堆栈空间 把数据 “弹” 回寄存器(先读、再增 SP )
      场景:函数调用时的参数传递与返回地址保存。

5.LDM/STM(Load/Store Multiple)
      功能:批量加载 / 存储多个寄存器值。
      示例:STMIA R0!, {R1-R3} // 将 R1~R3 的值存入 R0 指向的连续内存地址
                 LDMIA R0!, {R1-R3} //从 R0 指向的连续内存地址,依次读取数据到 R1~R3 寄存

      场景:函数调用时保存 / 恢复寄存器上下文。

6.B(Branch)
      功能:无条件跳转至指定地址(Flash 中的指令)。
      示例:B main // 跳转到 main 函数地址执行。
      场景:实现代码分支。
7.BL(Branch with Link)
      功能:调用子函数,自动保存返回地址到 LR(R14)。
      示例:BL delay // 调用 delay 函数,执行完后通过 LR 返回。
      场景:函数调用机制的核心。
8.BX(Branch and Exchange)
      功能:根据寄存器值跳转,支持 ARM/Thumb 状态切换。
      示例:BX LR // 从子函数返回(LR 保存返回地址)。
      场景:函数返回、中断处理返回。
————————————————
版权声明:本文为CSDN博主「今天阳光明媚吗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2502_90478897/article/details/148921184

您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

4323

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部