嵌入式原理与应用篇---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.pswp.cn/bicheng/87369.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RHCSA-Linux考试题目笔记(自用)】servera的题目

一、开始 1、启动rhcsa环境 2、点击题目&#xff0c;看题 3、通过控制器来启动所有虚拟机 控制器 打开后点start&#xff0c;然后ok 之后进入一个有classroom、servera、serverb&#xff08;考试不一定叫这些名&#xff0c;但大差不差&#xff09;什么之类的界面&#xff0c;…

SpringBoot项目使用arthas-tunnel-server

参考官网Arthas Spring Boot Starter | arthas Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践-腾讯云开发者社区-腾讯云 springBoot项目, 增加maven依赖 <dependency><groupId>com.taobao.arthas</groupId><artifactId>arthas-sprin…

Modbus TCP 进阶:基于以太网的远程设备控制(二)

基于 Modbus TCP 的远程设备控制实战 &#xff08;一&#xff09;硬件与网络搭建实操 1. 设备选型与连接 在工业现场&#xff0c;根据远程控制需求进行设备选型至关重要 。对于传感器&#xff0c;若要监测温度&#xff0c;可选择高精度的热电偶传感器&#xff0c;如 K 型热电…

分库分表之实战-sharding-JDBC

大家好&#xff0c;我是工藤学编程 &#x1f989;一个正在努力学习的小博主&#xff0c;期待你的关注实战代码系列最新文章&#x1f609;C实现图书管理系统&#xff08;Qt C GUI界面版&#xff09;SpringBoot实战系列&#x1f437;【SpringBoot实战系列】Sharding-Jdbc实现分库…

httpcore-nio引起的线程、fd泄露问题

依赖来源&#xff1a;httpasyncclient-4.1.4.jar 现象 程序报错too many open files 线程数飙升、句柄数飙升 thread dump显示大量 "I/O dispatcher 7215" #9102 prio5 os_prio0 tid0x00002b7ba036a800 nid0x6f24 runnable [0x00002b7d98d41000]java.lang.Thread.…

多线程生产者消费者模型实战案例

多线程生产者消费者模型实战案例 前言业务场景术前准备无锁无事务有事务 synchronized事务在锁外事务在锁内 数据库行锁什么是数据库行锁有事务没有事务 乐观锁ReentrantLock分布式锁 前言 曾经一直有一个疑惑&#xff0c;就是关于多线程生产者消费者模型的学习过程中&#xf…

青少年编程与数学 02-022 专业应用软件简介 03 三维建模及动画软件:Autodesk Maya

青少年编程与数学 02-022 专业应用软件简介 03 三维建模及动画软件&#xff1a;Autodesk Maya 一、什么是三维建模二、什么是计算机动画三、三维建模及动画设计软件的发展历程&#xff08;一&#xff09;早期探索阶段&#xff08;20世纪60年代 - 80年代&#xff09;&#xff08…

获得 OCM 大师证书学习历练

当我站在山城重庆的洪崖洞前&#xff0c;看着璀璨的夜景倒映在嘉陵江上&#xff0c;手中紧握着 OCM 大师证书&#xff0c;那一刻&#xff0c;备考时的艰辛与考试时的紧张都化作了满满的成就感。这段在重庆获得 OCM 大师证书的经历&#xff0c;就像一场充满挑战与惊喜的冒险&…

srs-gb28181 与 SRS 5.0 对 GB28181 国标支持

srs-gb28181 是基于 SRS 4.0/5.0 的国标&#xff08;GB28181&#xff09;扩展分支&#xff0c;而 SRS 5.0 官方版本也逐步增强了对 GB28181 的支持。以下是两者的主要区别&#xff1a; 1. 功能支持对比 功能srs-gb28181&#xff08;扩展分支&#xff09;SRS 5.0&#xff08;官…

算法第18天|继续二叉树:修剪二叉搜索树、将有序数组转化为二叉搜索树、把二叉搜索树转换为累加树

今日总结&#xff1a; 1、修剪二叉搜索树&#xff08;重点思考如何修剪&#xff09; &#xff08;1&#xff09;递归的返回值是什么&#xff1f;&#xff08;与插入、删除一样&#xff09; &#xff08;2&#xff09;递归的单层逻辑一定要缕清&#xff08;3中情况讨论&#xff…

C# 多线程(三)线程池

目录 1.通过TPL使用线程池 2.不使用TPL进入线程池的办法 异步委托 3.线程池优化技术 最小线程数的工作原理 每当启动一个新线程时&#xff0c;系统都需要花费数百微秒来分配资源&#xff0c;例如创建独立的局部变量栈空间。默认情况下&#xff0c;每个线程还会占用约1…

学习笔记(29):训练集与测试集划分详解:train_test_split 函数深度解析

学习笔记(29):训练集与测试集划分详解&#xff1a;train_test_split 函数深度解析 一、为什么需要划分训练集和测试集&#xff1f; 在机器学习中&#xff0c;模型需要经历两个核心阶段&#xff1a; 训练阶段&#xff1a;用训练集数据学习特征与目标值的映射关系&#xff08;…

【全网唯一】自动化编辑器 Windows版纯本地离线文字识别插件

目的 自动化编辑器超轻量级RPA工具&#xff0c;零代码制作RPA自动化任务&#xff0c;解放双手&#xff0c;释放双眼&#xff0c;轻松玩游戏&#xff0c;刷任务。本篇文章主要讲解下自动化编辑器的TomatoOCR纯本地离线文字识别Windows版插件如何使用和集成。 准备工作 1、下载自…

GitHub 2FA绑定

GitHub 2FA绑定 作为全球最大的代码托管平台&#xff0c;GitHub对账号安全的重视程度不断提升——自2023年3月起&#xff0c;GitHub已要求所有在GitHub.com上贡献代码的用户必须启用双因素身份验证&#xff08;2FA&#xff09;。如果你是符合条件的用户&#xff0c;会收到一封…

pytest fixture基础大全详解

一、介绍 作用 fixture主要有两个作用&#xff1a; 复用测试数据和环境&#xff0c;可以减少重复的代码&#xff1b;可以在测试用例运行前和运行后设置和清理资源&#xff0c;避免对测试结果产生影响&#xff0c;同时也可以提高测试用例的运行效率。 优势 pytest框架的fix…

Unity知识点-Renderer常用材质变量

本篇总结了Unity中renderer的3种常用的材质相关的变量&#xff1a;renderer.material,renderer.sharedMaterial,renderer.MaterialPropertyBlock。以及三者对SRPBatcher的影响。 一.介绍及对比 1.概念介绍 1.material 定义&#xff1a;material 是Render组件&#xff08;如…

【算法】​​如何判断时间复杂度?

文章目录 1. 什么是时间复杂度&#xff1f;为什么需要时间复杂度&#xff1f; 2. 常见时间复杂度对比3. 如何分析时间复杂度&#xff1f;&#xff08;Java版&#xff09;&#x1f539; 步骤1&#xff1a;找出基本操作&#x1f539; 步骤2&#xff1a;分析循环结构&#xff08;1…

MySQL使用C语言连接

文章目录 版本查看以及编译mysql接口介绍初始化链接数据库下发mysql命令mysql_query获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields获取列名mysql_fetch_fields获取结果内容mysql_fetch_row关闭mysql链接mysql_closeC语言操作mysql查看…

坚持每日Codeforces三题挑战:Day 7 - 题目详解(2025-06-11,难度:1200,1300,1500)

每天坚持写三道题第七天&#xff1a; Problem - A - Codeforces 1200 Problem - B - Codeforces 1300 Problem - A - Codeforces 1500 目录 题目一: 题目大意: 解题思路: 代码(C): 题目二: 题目大意: 解题思路: 代码(C): 题目三: 题目大意: 解题思路: 代码(C): …

洛谷 P4305:[JLOI2011] 不重复数字 ← unordered_set

【题目来源】 https://www.luogu.com.cn/problem/P4305 【题目描述】 给定 n 个数&#xff0c;要求把其中重复的去掉&#xff0c;只保留第一次出现的数。 【输入格式】 第一行一个整数 T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行一个整数 n。第二行 n 个数…