ARM 汇编指令:STM

ARM 汇编指令:STM

本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~
1、汇编指令在不同架构中的联系与区别
2、ARM 汇编指令:MOV
3、ARM 汇编指令:LDR
4、ARM 汇编指令:STR
5、ARM 汇编指令:MRS 和 MSR
6、ARM 汇编指令:ORRS
7、ARM 汇编指令:BEQ
8、ARM 汇编指令:TST
9、ARM 汇编指令:B
10、ARM 汇编指令:BX
11、ARM 汇编指令:ERET
12、ARM 汇编指令:STP\LDP
13、ARM 汇编指令:UBFX
14、ARM 汇编指令:STM

STMARM 汇编指令中的存储多个寄存器指令 ,全称是 Store Multiple

基本功能

多个寄存器的值存入连续的内存地址 中。它是 LDM(加载多个寄存器)的逆操作。

基本语法

assembly 复制代码
STM{条件}{寻址模式} Rn{!}, {寄存器列表}{^}

关键组成部分

1. 寻址模式(Addressing Mode)

决定地址的增长方向和起始/结束位置:

  • IA(Increment After):操作后地址增加(默认)
  • IB(Increment Before):操作前地址增加
  • DA(Decrement After):操作后地址减少
  • DB(Decrement Before):操作前地址减少

2. 寄存器列表

用花括号 {} 包含要存储的寄存器,用逗号分隔:

assembly 复制代码
STMIA R0!, {R1-R4, R7}  ; 将 R1,R2,R3,R4,R7 存入内存

3. 写回选项 !

Rn! 表示操作后更新基址寄存器 Rn 的值。

4. 特权模式选项 ^

在特权模式下使用,用于恢复用户模式的寄存器。

常见用法示例

示例 1:基本存储

assembly 复制代码
STMIA R0!, {R1-R5}    ; 将 R1~R5 存入 R0 指向的地址,R0 每次增加

示例 2:栈操作(向下满栈)

assembly 复制代码
STMDB SP!, {R0-R3, LR}  ; 将寄存器压栈(相当于 PUSH)

示例 3:批量数据保存

assembly 复制代码
; 保存工作寄存器到内存缓冲区
STMIA R8, {R0-R7}      ; 将 R0~R7 保存到 R8 指向的位置

与栈操作的关系

ARM 中常用 STM/LDM 配合寻址模式实现栈操作:

指令组合 等效指令 描述
STMDB SP!, {...} PUSH 压栈
LDMIA SP!, {...} POP 出栈

重要特性

  1. 存储顺序:总是从低编号寄存器到高编号寄存器存储
  2. 内存地址:连续递增或递减
  3. 原子性:在中断上下文中需注意,可能被中断打断
  4. 效率:比多条单寄存器存储指令更高效

实际应用场景

  • 函数调用时的上下文保存
  • 任务切换时的寄存器保存
  • 批量数据搬移
  • 中断处理程序入口

STM 是 ARM 汇编中非常重要的批量内存操作指令,特别在函数调用和上下文保存中广泛应用。

相关推荐
C++ 老炮儿的技术栈11 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
fenglllle14 小时前
使用AI能力编译ARM版本的截图软件
arm开发·人工智能
cch891816 小时前
Java vs 汇编:高级与低级的终极对决
java·开发语言·汇编
2301_7890156216 小时前
C++:智能指针
c语言·开发语言·汇编·c++·智能指针
somi72 天前
ARM-驱动-02-Linux 内核开发环境搭建与编译
linux·运维·arm开发
XINVRY-FPGA2 天前
XC7VX690T-2FFG1157I Xilinx AMD Virtex-7 FPGA
arm开发·人工智能·嵌入式硬件·深度学习·fpga开发·硬件工程·fpga
cpp_learners2 天前
Linux ARM架构 使用 linuxdeployqt 打包QT程序
linux·arm开发·qt
森G2 天前
3.1、移植Qt程序到ARM平台----移植Qt程序到ARM平台(扩展)
arm开发·c++·qt
炭烤毛蛋2 天前
rk3588 适配音频解码芯片 es8388
arm开发·音视频·rk3588·es8388
独小乐2 天前
007.GNU C内联汇编杂谈|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·汇编·单片机·嵌入式硬件·arm·gnu