当前位置: 首页 > news >正文

嵌入式原理与应用篇---ARM

ARM 架构的 STM32 系列微控制器广泛应用于嵌入式系统开发,理解其汇编语言指令对于优化性能、访问硬件底层非常重要。下面详细解释常见的 ARM 汇编指令及其使用实例。

数据处理指令

1. MOV(移动)
  • 功能:将立即数或寄存器值复制到目标寄存器。
  • 语法MOV Rd, Rn 或 MOV Rd, #immediate
  • 实例
    MOV R0, #10      ; R0 = 10(立即数)
    MOV R1, R0       ; R1 = R0(寄存器到寄存器)
    
2. ADD(加法)
  • 功能:两个操作数相加,结果存入目标寄存器。
  • 语法ADD Rd, Rn, Rm 或 ADD Rd, Rn, #immediate
  • 实例
    ADD R2, R0, R1   ; R2 = R0 + R1
    ADD R3, R2, #5   ; R3 = R2 + 5
    
3. SUB(减法)
  • 功能:两个操作数相减,结果存入目标寄存器。
  • 语法SUB Rd, Rn, Rm 或 SUB Rd, Rn, #immediate
  • 实例
    SUB R4, R3, R1   ; R4 = R3 - R1
    SUB R5, R4, #2   ; R5 = R4 - 2
    
4. CMP(比较)
  • 功能:比较两个操作数,设置标志位(不存储结果)。
  • 语法CMP Rn, Rm 或 CMP Rn, #immediate
  • 实例
    CMP R0, R1       ; 比较 R0 和 R1(R0 - R1)
    ; 根据比较结果设置标志位(Z=1 表示相等,N=1 表示 R0 < R1)
    

内存访问指令

1. LDR(加载字)
  • 功能:从内存加载 32 位数据到寄存器。
  • 语法LDR Rd, [Rn, #offset]
  • 实例
    LDR R0, [R1]     ; R0 = 内存地址 R1 处的数据
    LDR R2, [R1, #4] ; R2 = 内存地址 R1+4 处的数据
    
2. STR(存储字)
  • 功能:将寄存器数据存储到内存。
  • 语法STR Rd, [Rn, #offset]
  • 实例
    STR R0, [R1]     ; 内存地址 R1 = R0
    STR R2, [R1, #8] ; 内存地址 R1+8 = R2
    

分支指令

1. B(无条件跳转)
  • 功能:跳转到指定地址执行。
  • 语法B label
  • 实例
    B loop           ; 跳转到 loop 标签处
    
2. BEQ(相等时跳转)
  • 功能:如果 Z 标志位为 1(上一次比较结果相等),则跳转。
  • 语法BEQ label
  • 实例
    CMP R0, R1       ; 比较 R0 和 R1
    BEQ equal        ; 如果 R0 == R1,跳转到 equal
    
3. BL(带链接跳转)
  • 功能:跳转到子程序并保存返回地址到 LR(R14)。
  • 语法BL function
  • 实例
    BL delay         ; 调用 delay 子程序
    ; 执行完 delay 后,通过 BX LR 返回
    

位操作指令

1. AND(按位与)
  • 功能:两个操作数按位与,结果存入目标寄存器。
  • 语法AND Rd, Rn, Rm
  • 实例
    AND R0, R0, #0x0F  ; 保留 R0 的低4位,高28位清零
    
2. ORR(按位或)
  • 功能:两个操作数按位或,结果存入目标寄存器。
  • 语法ORR Rd, Rn, Rm
  • 实例
    ORR R0, R0, #0x01  ; 设置 R0 的最低位为1
    
3. EOR(按位异或)
  • 功能:两个操作数按位异或,结果存入目标寄存器。
  • 语法EOR Rd, Rn, Rm
  • 实例
    EOR R0, R0, #0xFF  ; 翻转 R0 的低8位
    

实例:LED 闪烁程序

下面是一个使用 STM32 汇编控制 LED 闪烁的完整示例:

; STM32F103 LED闪烁程序.syntax unified.cpu cortex-m3.thumb; 寄存器地址定义
.equ RCC_APB2ENR, 0x40021018    ; 外设时钟使能寄存器
.equ GPIOC_CRH,   0x40011004    ; GPIOC配置寄存器高
.equ GPIOC_ODR,   0x4001100C    ; GPIOC输出数据寄存器
.equ LED_PIN,     0x1000        ; PC13对应的位; 代码段.section .text.global _start_start:; 初始化堆栈指针LDR r0, =_estackMOV sp, r0; 使能GPIOC时钟LDR r0, =RCC_APB2ENRLDR r1, [r0]ORR r1, r1, #0x00000010      ; 使能GPIOC时钟STR r1, [r0]; 配置PC13为推挽输出(模式11: 50MHz,CNF00: 通用推挽输出)LDR r0, =GPIOC_CRHLDR r1, [r0]BIC r1, r1, #0x00F00000      ; 清除PC13的配置位ORR r1, r1, #0x00300000      ; 设置PC13为50MHz推挽输出STR r1, [r0]loop:; 点亮LED(PC13输出低电平)LDR r0, =GPIOC_ODRLDR r1, [r0]BIC r1, r1, #LED_PIN         ; 清除PC13位(输出低)STR r1, [r0]; 延时BL delay; 熄灭LED(PC13输出高电平)LDR r0, =GPIOC_ODRLDR r1, [r0]ORR r1, r1, #LED_PIN         ; 设置PC13位(输出高)STR r1, [r0]; 延时BL delayB loop                       ; 无限循环; 简单延时函数
delay:PUSH {r0, r1}MOV r0, #0xFFFF             ; 外层循环计数delay_outer:MOV r1, #0xFFFF             ; 内层循环计数delay_inner:SUBS r1, r1, #1             ; 递减计数BNE delay_inner             ; 不为0则继续循环SUBS r0, r0, #1             ; 外层计数递减BNE delay_outer             ; 不为0则继续循环POP {r0, r1}BX lr                        ; 返回

总结

ARM 汇编指令是开发 STM32 微控制器的基础,掌握数据处理、内存访问、分支跳转和位操作指令后,可以实现底层硬件控制和高性能代码优化。实际开发中,通常结合 C 语言和汇编以平衡效率和可维护性。

http://www.lqws.cn/news/562285.html

相关文章:

  • 深度学习量化数值类型
  • 机器学习——线性回归
  • 数据结构与算法学习笔记(Acwing 提高课)----动态规划·单调队列优化DP
  • Requests源码分析:底层逻辑
  • 模板方法 + 策略接口
  • glog使用详解和基本使用示例
  • 数据结构:顺序表
  • Lua现学现卖
  • Java代码阅读题
  • 06-three.js 创建自己的缓冲几何体
  • 某音Web端消息体ProtoBuf结构解析
  • 【网络安全】网络安全中的离散数学
  • 机器学习算法-K近邻算法-KNN
  • BUUCTF [ACTF新生赛2020]music 1
  • SpringMVC系列(五)(响应实验以及Restful架构风格(上))
  • 【学习】《算法图解》第七章学习笔记:树
  • [论文阅读] 软件工程 | 微前端在电商领域的实践:一项案例研究的深度解析
  • Linux软件的安装目录
  • 【面板数据】省级电商指数与地级市电子商务交易额数据集(1990-2022年)
  • OpenLayers 下载地图切片
  • Docker安装MinIO
  • 概述-4-通用语法及分类
  • 【go】初学者入门环境配置,GOPATH,GOROOT,GOCACHE,以及GoLand使用配置注意
  • 案例开发 - 日程管理系统 - 第一期
  • Redis 实现分布式锁
  • 【C++进阶】--- 继承
  • 鸿蒙 Grid 与 GridItem 深度解析:二维网格布局解决方案
  • 复杂驱动开发-TLE9471的休眠流程与定时唤醒
  • Python训练营-Day44-预训练模型
  • Java中的异常及异常处理