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 得到了正确的值,不恢复也 没关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788060.shtml

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

相关文章

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff…

测试人员前期参与设计方案时需要注意什么?

服务的健壮性跟系统设计有很大关系&#xff0c;前期设计时考虑多一些处理逻辑&#xff0c;可以避免后期出现问题带来的损失以及修复问题的成本。 在前期讨论设计方案时测试同学也需要参与&#xff0c;而不只是埋头设计用例和测试&#xff0c;开发同学可能因为思维局限或者思考…

ssm018简易版营业厅宽带系统+jsp

营业厅宽带系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

QCustomPlot一、QCustomPlot基础及画图显示

1、QCustomPlot下载 QCustomPlot源码demo 根据需要选择需要的文件&#xff1a; 完整版。QCustomPlot.tar.gz 源代码例子帮助文档&#xff1b; 共享库。QCustomPlot-sharedlib.tar.gz 库编译和使用&#xff1b; 源代码。QCustomPlot-source.tar.gz 源代码 里面包含了很多QCusto…

夜晚兼职好选择:六大副业助你增收

晚上兼职&#xff0c;无疑是许多寻求额外收入人群的理想选择。以下为您精心推荐的六个副业&#xff0c;既适合晚间操作&#xff0c;又能让您在轻松愉悦中赚取额外收益。 网络调查与市场研究&#xff1a;利用晚上的闲暇时光&#xff0c;参与网络调查与市场研究&#xff0c;为企业…

TO-277肖特基二极管 散热效果好 型号齐全

市场对于肖特基二极管的需求非常旺盛&#xff0c;近日常有客户前来东沃电子咨询TO-277B 封装系列肖特基二极管选型、价格、交期、现货等方面的问题。东沃电子推出的TO-277B 封装系列肖特基产品&#xff0c;外形扁平&#xff0c;散热片外露设计&#xff0c;能够有效改善散热能力…

配置plsql链接Oracle数据库(新手)

配置plsql链接Oracle数据库 安装Oracle客户端 、安装plsql客户端并激活 配置tnsnames.ora文件&#xff08;路径D:\app\peter\Oracle\InstantClient\network\admin根据你的实际路径设置&#xff09; 配置文件如下 # tnsnames.ora Network Configuration File: D:\app\peter\O…

练习 16 Web [极客大挑战 2019]LoveSQL

extractvalue(1,concat(‘~’, (‘your sql’) ) )报错注入&#xff0c;注意爆破字段的时候表名有可能是table_name不是table_schema 有登录输入框 常规尝试一下 常规的万能密码&#xff0c;返回了一个“admin的密码”&#xff1a; Hello admin&#xff01; Your password is…

2024最新软件测试【测试理论+ app 测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

JAVA基础02-Java语言基础以及编译准备工作

什么是JAVA语言 Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用的两个特征。 &#xff08;可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式…

DEM高程数字模型制作技术分享

1. 引言 ​数字高程模型&#xff08;Digital Elevation Model&#xff0c;简称DEM&#xff09;是地形表面地形特征的数字表示。它提供了关于地面起伏、地形形态、地表特征等重要信息。在地理信息系统&#xff08;GIS&#xff09;、遥感、地质学、水利工程等领域&#xff0c;DEM…

Golang数据库事务实践

事务是很多业务的基础&#xff0c;本文介绍了如何在Golang里实现数据库事务操作&#xff0c;并以一个用户注册场景给出了完整实现。原文: Transactions in Go application Go 是一种年轻而强大的语言&#xff0c;专为编写小型、简单的服务而创建。但随着时间推移&#xff0c;越…

redis数据类型介绍

字符串string&#xff1a; 字符串类型是Redis中最为基础的数据存储类型&#xff0c;是一个由字节组成的序列&#xff0c;他在Redis中是二进制安全的&#xff0c;这便意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据货Json对象描述信息等&#xff0c;是标准的key…

分享几个可以免费使用的GPT网站吧

1. ChatGAI ChatGAI是一个界面简洁的AI平台&#xff0c;提供App和网页版&#xff0c;每日均有免费使用机会。 2. ChatGPT 本网站向大家开放了ChatGPT 3.5和4.0版本的免费体验&#xff0c;特别适合新用户。每天都有免费次数&#xff0c;响应迅速&#xff0c;注册便捷&#xff0…

java中split(“.“)失效问题

来源&#xff1a;比较版本号_牛客题霸_牛客网 在写到这道算法题的时候&#xff0c;发现一个问题&#xff0c; String[] leftversion1.split("."); 返回结果为空&#xff0c;经过查阅得知&#xff0c;是split中的正则表达式里的问题&#xff0c;这个 . 代表的意思是…

深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度

看这篇前请先把我上一篇了解一下&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 前言&#xff1a; 相信很多学习数据结构的人&#xff0c;都会遇到一种情况&#xff0c;就是明明最一开始学习就学习了时间复杂度&#xff0c;但是在后期…

12313124

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

【与C++的邂逅】---- 函数重载与引用

关注小庄 顿顿解馋(▿) 喜欢的小伙伴可以多多支持小庄的文章哦 &#x1f4d2; 数据结构 &#x1f4d2; C 引言 : 上一篇博客我们了解了C入门语法的一部分&#xff0c;今天我们来了解函数重载&#xff0c;引用的技术&#xff0c;请放心食用 ~ 文章目录 一. &#x1f3e0; 函数重…

【JavaWeb】Day31.SpringBootWeb请求响应——分层解耦(二)

3.IOC&DI 3.1 IOC&DI入门 完成Controller层、Service层、Dao层的代码解耦 思路&#xff1a; 1. 删除Controller层、Service层中new对象的代码 2. Service层及Dao层的实现类&#xff0c;交给IOC容器管理 3. 为Controller及Service注入运行时依赖的对象 Controller程序…

隐私计算实训营第六讲-隐语PIR介绍及开发实践

隐私计算实训营第六讲-隐语PIR介绍及开发实践 文章目录 隐私计算实训营第六讲-隐语PIR介绍及开发实践1.隐语实现PIR总体介绍1.1按服务器数量分类1.2按查询类型分类 2. Index PIR - SealPIR3. Keyword PIR - Labeled PSI4.隐语PIR功能分层5.隐语PIR后续计划PIR协议开发PIR调用框…