嵌入式必会的几条ARM汇编指令

就这几条混个面熟就行

  • 读内存指令:LDR,即Load之意
  • 写内存指令:STR,即Store之意
  • 加减指令:ADD、SUB
  • 跳转:BL,即Branch And Link
  • 入栈指令:PUSH
  • 出栈指令:POP

此处是学习韦老师的视频整理的,视频中也有讲解这6个指令,参考链接:https://www.bilibili.com/video/BV17U4y1K7EL/?p=4

  1. 读内存指令:LDR(Load)
  • 用途:从内存加载数据到寄存器。
  • 语法:LDR Rd, Rn, #offset
    • Rd:目标寄存器
    • Rn:基址寄存器
    • #offset:偏移量(可选)
asm 复制代码
LDR R0, [R1, #4]   ; 将内存地址R1+4处的数据加载到寄存器R0
  1. 写内存指令:STR(Store)
  • 用途:将寄存器中的数据存储到内存。
  • 语法:STR Rd, Rn, #offset
    • Rd:源寄存器
    • Rn:基址寄存器
    • #offset:偏移量(可选)
asm 复制代码
STR R0, [R1, #4]   ; 将寄存器R0中的数据存储到内存地址R1+4处
  1. 加减指令:ADD(加)、SUB(减)
  • 用途:执行加法和减法运算。
  • 加法语法:ADD Rd, Rn, Rm
    • Rd:目标寄存器
    • Rn:第一个操作数寄存器
    • Rm:第二个操作数寄存器
asmm 复制代码
ADD R0, R1, R2   ; 将寄存器R1和R2的值相加,并存储到R0
  • 减法语法:SUB Rd, Rn, Rm
    • Rd:目标寄存器
    • Rn:第一个操作数寄存器
    • Rm:第二个操作数寄存器
asm 复制代码
SUB R0, R1, R2   ; 将寄存器R1减去R2的值,并存储到R0
  1. 跳转指令:BL(Branch and Link)
  • 用途:跳转到一个子程序,同时保存返回地址到链接寄存器(LR)。
  • 语法:BL label
    • label:目标地址的标签
asm 复制代码
BL subroutine   ; 跳转到subroutine子程序,并保存返回地址到LR
  1. 入栈指令:PUSH
  • 用途:将寄存器内容压入堆栈。
  • 语法:PUSH {registers}
    • {registers}:要压入堆栈的寄存器列表
asm 复制代码
PUSH {R0, R1}   ; 将寄存器R0和R1的内容压入堆栈
  1. 出栈指令:POP
  • 用途:从堆栈弹出数据到寄存器。
  • 语法:POP {registers}
    • {registers}:要从堆栈弹出的寄存器列表
asm 复制代码
POP {R0, R1}   ; 从堆栈弹出数据到寄存器R0和R1

ARM汇编示例以下是一个ARM汇编代码示例,演示如何使用这些指令:

asm 复制代码
.global _start

_start:
    LDR R0, =data         ; 将data地址加载到R0
    LDR R1, [R0]          ; 从内存加载data内容到R1
    ADD R1, R1, #10       ; 将R1的值加10
    STR R1, [R0]          ; 将R1的值存回内存data地址
    BL subroutine         ; 跳转到subroutine子程序

subroutine:
    PUSH {LR}             ; 将链接寄存器压入堆栈
    SUB R0, R0, #5        ; 将R0的值减5
    POP {LR}              ; 从堆栈弹出返回地址到LR
    BX LR                 ; 返回主程序

.data
data: .word 0x12345678    ; 定义一个32位数据

这个示例代码从内存读取一个数据,加上一个常数,然后存回内存。之后调用一个子程序,该子程序修改寄存器值并返回主程序。

相关推荐
00后程序员张7 小时前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
Lee_jerome20 小时前
《C/C++编译全家桶:g++四阶段、.a与.so区别、CMake构建、ARM交叉编译,这篇全讲透了》
c语言·开发语言·arm开发·c++·编译·cmake·cmakelists
Dlrb12111 天前
ARM---IMX6ULL的LCD模块简介及LCD驱动程序的编写
arm开发·lcd·arm·imx6ull·显存·像素
深信达沙箱2 天前
漏洞修不完、合规过不了?先御OS如何让嵌入式设备‘出厂即合规
arm开发·操作系统·嵌入式操作系统
木木_王2 天前
嵌入式学习 | STM32 裸板驱动开发(Day05)超详细复习笔记外部中断 EXTI、NVIC 优先级、串口中断实战
arm开发·stm32·学习
振南的单片机世界2 天前
3.5T静默分帧,CRC16校验:Modbus-RTU帧结构解析
arm开发·stm32·单片机·嵌入式硬件
m0_547486662 天前
《Arm Cortex-M4嵌入式系统-STM32G4系列微控制器的原理架构与开发》全套PPT课件
arm开发·stm32·嵌入式硬件
工业设备方案笔记2 天前
RK3588 AI部署实战:如何在ARM设备上运行AI模型?——从模型转换到边缘推理全过程解析
arm开发·人工智能·边缘计算
2601_954706492 天前
基于 ARM 虚拟化的云手机架构选型与 Python 自动化实战——2026 年 8 月为何我推荐傲晨云手机
arm开发·智能手机·架构
执迷不悟8233 天前
ARM--ADC/SPI
arm开发