STM32 M3内核寄存器概念

2024-04-02 23:36
文章标签 概念 stm32 内核 寄存器 m3

本文主要是介绍STM32 M3内核寄存器概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内容主要来自<<M3内核权威指南>> 

汇编程序中的最低有效位(Least Significant Bit)。LSB是二进制数中最右边的位,它代表了数值中的最小单位。在汇编程序中,LSB通常用于表示数据的最小精度或者作为标志位。

-----------在执行 PUSHPOP 操作时,那个通常被称为 SP(R13或写作 SP) 的地址寄存器,会自动被调整, 以避免后续的操作破坏先前的数据。

--------------------------------

(;后面是注释,前面是汇编)

subroutine_1

PUSH {R0-R7, R12, R14} ; 保存寄存器列表

… ; 执行处理

POP {R0-R7, R12, R14} ; 恢复寄存器列表

BX R14 ; 返回到主调函数 

---------------------------------

subroutine_1

这是一个标签,标识了子程序subroutine_1的开始位置。其他地方的代码可以通过跳转到这个标签来执行这个子程序。

PUSH {R0-R7, R12, R14}

PUSH指令用于将寄存器的内容压入堆栈。在这里,它压入了R0R7(连续的八个寄存器),R12,和R14这三个寄存器的当前值到堆栈上。这样做是为了在子程序执行期间保存这些寄存器的原始值,防止子程序修改这些值影响到调用它的代码。

这里省略了子程序中的其他指令或代码

POP {R0-R7, R12, R14}

POP指令用于从堆栈中弹出值并加载到寄存器中。这里,它恢复了之前通过PUSH指令压入堆栈的寄存器的值。这样,当子程序返回时,这些寄存器的值就像子程序从未被调用过一样。

BX R14

BX指令用于跳转到由寄存器指定的地址。在这里,它跳转到R14寄存器中存储的地址。在ARM汇编中,R14(通常称为LR,Link Register)通常用于存储子程序返回地址。因此,这条指令实际上是使子程序返回到它被调用的地方。

                     

-------------- R14 是连接寄存器(LR

main ;主程序

BL function1 ; 使用“分支并连接”指令呼叫 function1 ; PC= function1,并且 LR=main 的下一条指令地址

Function1

… ; function1 的代码

BX LR ; 函数返回(如果 function1 内部还要使用 LR,必须在使用前 PUSH, ; 否则返回时程序就可能跑飞了——译注)

------------------------------------

  1. main ;主程序

这表示主程序的入口点。
2. 

表示省略了一些代码或指令。
3. BL function1

BL是一个指令,用于跳转到function1。在汇编语言中,BL(或类似的指令)用于调用子程序或函数。在这里,它调用了一个名为function1的函数或子程序。
4. 

再次表示省略了一些代码或指令。
6. Function1

function1的开始。在汇编语言中,函数或子程序通常有一个标签来标识它们的开始,这样其他代码可以跳转到这个标签来执行该函数的代码。
7. … ;

function1 的代码
8. BX LR

BXLR是指令和寄存器。BX通常用于跳转到某个地址,而LR(Link Register)通常用于存储返回地址。在许多架构中,当从子程序返回时,LR会存储调用子程序之前的地址,这样程序可以继续执行。

所以BX LR,用于从function1返回到之前调用它的地方(即BL function1之后的代码)。

----------------R15 是程序计数器(PC)

0x1000: MOV R0, PC ; R0 = 0x1004

0x1000 是这条指令本身的地址。当 MOV R0, PC 执行时,它会把 PC 的当前值(即这条指令后面的地址)移动到 R0 寄存器中。

通常情况下,在指令 MOV R0, PC 执行后,PC 的值已经自增到了下一条指令的地址。因此,如果 MOV R0, PC 这条指令位于地址 0x1000,那么 PC 的值(在执行这条指令时)将会是 0x1004((假设每条指令占用 4 个字节的空间)

这里的逻辑是:PC 总是指向下一条要执行的指令,所以当 MOV R0, PC 执行时,它实际上是把下一条指令的地址(即 0x1004)存到了 R0 寄存器中。

------------------------

PUSH/POP 指令支持一次操作多个寄存器。像这样:

PUSH {R0-R2} ;压入 R0-R2

PUSH {R3-R5,R8, R12} ;压入 R3-R5,R8,以及 R12

在 POP 时,可以如下操作:

POP {R0-R2} ;弹出 R0-R2

POP {R3-R5,R8, R12} ;弹出 R3-R5,R8,以及 R12

注意:不管在寄存器列表中,寄存器的序号是以什么顺序给出的,汇编器都将把它们升 序排序。然后 PUSH 指令按照从大到小的顺序依次入栈,POP 则按从小到大的顺序依次出栈。 如果不按升序写寄存器,有些汇编器可能会给出一个语法错误。

PUSH/POP 对子还有这样一种特殊形式,形如

PUSH {R0-R3, LR}

POP {R0-R3, PC}

请注意:POP 的最后一个寄存器是 PC,并不是先前 PUSH 的 LR。这其实是一个返回的小 技巧。因为总要把先前 LR 的值弹出来,再使用此值返回,干脆绕过 LR,直接传给 PC!  LR 在子程序返回时的唯一用处就是提供返回地址,在 返回后,先前保存的返回地址就没有利用价值了,所以只要 PC 得到了正确的值,不恢复也 没关系

这篇关于STM32 M3内核寄存器概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871358

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc