基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。

RISC

ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点:
① 对内存只有读、写指令
② 对于数据的运算是在CPU内部实现
③ 使用RISC指令的CPU复杂度小一点,易于设计

底层代码执行步骤

在这里插入图片描述
例如:图中所示的运算a = a + b在RISC中要使用4条汇编指令:
① CPU从内存中读入a
② CPU从内存中读入b
③ CPU计算a + b,并写入到内存中
④ 把结果写入内存

CPU、内存、flash

CPU用来做计算,内存用来存数据,flash用来存放程序

  1. CPU如何知道自己要做什么呢?
    flash中的汇编指令告诉的。
  2. 计算 a + b时,在CPU内部,用什么来保存a、b、a+b ?
    CPU内部都有R0、R1、……、R15寄存器;它们可以用来“暂存”数据。
  3. 读写操作通过什么实现?
    寄存器 和 数据的地址。
    在这里插入图片描述
    对于R13、R14、R15,还另有用途:
    R13:别名SP(Stack Pointer),栈指针;用来保存栈的地址
    R14:别名LR(Link Register),用来保存返回地址
    R15:别名PC(Program Counter),程序计数器,表示当前指令地址,写入新值即可跳转
    xPSR:程序状态寄存器

了解汇编指令

《汇编语言(第3版) 》王爽著.pdf的书直接上传到我的Gitee仓库了,有需要直接获取:https://gitee.com/jingcheng11/embedded-data
数据传输的三大要素:目的、源、长度。

  • 读内存:Load
    # 示例LDR  R0, [R1,  #4]  ; 读地址"R1+4", 得到的4字节数据存入R0长度  目的  源
    

解释:
(长度)LDR :Load R,读四字节
(目的)R0
(源)[R1, #4]
补充:
LDR B:读1个字节 B表示:bit
LDR H:读1个字节 H表示:half
LDRD:读8个字节 D表示:double

  • 写内存:Stroe

    # 示例
    STR  R0, [R1, #4]  ; 把R0的4字节数据写入地址"R1+4"
    长度  源    目的
    

可以这样记汇编指令的 读内存、写内存:
读:目的<-----------源
写:源----------->目的
箭头是从“源”指向“目的”,只需要记住箭头方向即可。

  • 加减

    ADD R0, R1, R2  ; R0=R1+R2
    ADD R0, R0, #1  ; R0=R0+1
    SUB R0, R1, R2  ; R0=R1-R2
    SUB R0, R0, #1  ; R0=R0-1
    
  • 比较

    CMP R0, R1  ;  结果保存在PSR(程序状态寄存器)
    

CMP 表示compare,比较R0、R1

  • 跳转

    B  main  ; Branch, 直接跳转
    BL main  ; Branch and Link, 先把返回地址保存在LR寄存器里再跳转
    

B (Branch) 指令:
这条指令用于无条件地跳转到指定的地址。当使用 B 指令时,处理器会直接跳转到目标地址执行指令,但是不会保存任何返回地址信息。这意味着如果你使用 B 指令跳转到一个子程序,那么在子程序结束之后,你将无法自动返回到调用点,因为没有保存返回地址。
B 指令通常用于简单的程序流程控制,比如循环或者条件分支的另一部分。
BL (Branch and Link) 指令:
这条指令除了执行无条件跳转之外,还会先将当前指令的下一条指令的地址(即返回地址)保存在链接寄存器(Link Register,LR)中。LR 寄存器通常被用来存储调用子程序前的返回地址,这样在子程序结束时可以通过 LDR PC, [LR] 或 POP {PC} 等指令从 LR 中恢复返回地址,从而回到调用子程序之前的指令位置继续执行。
BL 指令常用于函数调用或当需要在执行完一段代码后返回到原处的情况。
总结来说,B 指令不保存返回地址,而 BL 指令在跳转前会保存返回地址到 LR 寄存器,这使得 BL 更适合用于子程序调用,而 B 更适用于不需要返回的简单跳转。

反汇编代码了解

让Keil生成反汇编:
在这里插入图片描述
制作反汇编的指令如下:

fromelf  --text  -a -c  --output=xxx.dis  xxx.axf

反汇编:
在这里插入图片描述

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

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

相关文章

CasaOS设备使用Docker安装SyncThing文件同步神器并实现远程管理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

加密软件有什么用?五款电脑文件加密软件推荐

加密软件对于个人和企业来说至关重要&#xff0c;尤其是在2024年这样一个高度数字化的时代&#xff0c;数据安全变得尤为重要。 数据保护&#xff1a;加密软件可以保护敏感信息不被未经授权的人访问。这包括个人数据、财务记录、健康信息、企业机密等。 防泄漏&#xff1a;防…

Python 全栈体系【三阶】(三)

第一章 Django 七、静态文件 1. 概述 静态文件是指在WEB应用中的图像文件、CSS文件、Javascript文件。 2. 静态文件的配置 settings.py中关于静态文件的配置如下&#xff1a; STATICFILES_DIRS [BASE_DIR , static, ]STATIC_URL /static/其中&#xff1a; STATICFILES…

java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

有面试题&#xff0c;有synchronized锁&#xff0c;threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作&#xff0c;手动释放锁&#xff0c;显式地获取锁&#xff08;属…

【llama3.1】ollama的使用--本地部署使用llama3.1模型

快速入门 安装完成ollama后,在命令行窗口输入 ollama run llama3 上图表示 Ollama 正在下载 llama3 任务所需的资源文件,并显示了当前的下载进度、速度和预计剩余时间。这是 Ollama 在准备运行 llama3 任务之前所需的步骤。 上面的步骤完成后,就可以在本地进行聊天了,…

Golang | Leetcode Golang题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; func missingNumber(nums []int) int {n : len(nums)total : n * (n 1) / 2arrSum : 0for _, num : range nums {arrSum num}return total - arrSum }

Xlua原理 二

一已经介绍了初步的lua与C#通信的原理&#xff0c;和xlua的LuaEnv的初始化内容。 这边介绍下Wrap文件。 一.Wrap介绍 导入xlua后可以看到会多出上图菜单。 点击后生成一堆wrap文件&#xff0c;这些文件是lua调用C#时进行映射查找用的中间代码。这样就不需要去反射调用节约性…

Vue中的diff算法

文章目录 diff算法是什么比较方式源码分析patchpatchVnodeupdateChildren小结Vue3中diff算法优化diff算法是什么 diff算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行,不会跨层级比较在dff比较的过程中,循环从两边向中间比较(首位交叉…

Linux系统下安装MySQL

前言&#xff1a; 本篇教程是使用Centos8来进行安装部署&#xff0c;如果使用的Linux系统发行版不同安装部署过程中可能会有差异&#xff0c;相同环境下可以跟着操作流程进行部署。本篇文章的主要目的是为了学习分享使用如有疑问欢迎提出并共同讨论。 1、安装前的准备工作 移除…

sql的执行流程

执行过程分成两层&#xff0c;一层是server层&#xff0c;主要进行连接服务&#xff0c;和分析语句&#xff0c;执行sql 具体流程是 首先与用户通过连接器建立连接&#xff0c;然后将sql查询语句在查询缓存中查找&#xff0c;如果查找处理过相同的语句将&#xff0c;直接返回数…

用uniapp 及socket.io做一个简单聊天app 2

在这里只有群聊&#xff0c;二个好友聊天&#xff0c;可以认为是建了一个二人的群聊。 const express require(express); const http require(http); const socketIo require(socket.io); const cors require(cors); // 引入 cors 中间件const app express(); const serv…

Nginx 如何处理请求的流量削峰?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 如何处理请求的流量削峰&#xff1f;一、什么是流量削峰二、Nginx 实现流量削峰的基本原理&#xff08;一&#xff09;反向代理与负载均衡&#xff08;二&…

微服务实战系列之玩转Docker(五)

前言 在我们日常的工作生活中&#xff0c;经常听到的一句话&#xff1a;“是骡子是马拉出来遛遛”。目的是看一个人/物是不是名副其实。我们在使用docker时&#xff0c;也要看看它究竟是如何RUN起来的。当面试官问你的时候&#xff0c;可以如是回答&#xff0c;保你“一文通关…

【python】OpenCV—Open URL Images

文章目录 1、需求描述2、方法一&#xff0c;numpyurlopen3、方法二&#xff0c;scikit-learn4、涉及到的库urllib.request.urlopenskimage.io.imread 5、参考文章 1、需求描述 给出一个 url 链接&#xff0c;显示该链接对应的图片 2、方法一&#xff0c;numpyurlopen # 导入…

Linux应用——socket函数及TCP通信

网络通信实质上也是实现进程间通信&#xff0c;只是与之前进程间通信不同的是&#xff0c;现在在不同的计算机上进行进程间通信。比如&#xff1a;利用QQ工具实现聊天&#xff0c;在两个电脑上有不同的QQ进程之间在通信。而网络通信是如何使用进程间通信呢&#xff1f;采用的是…

力扣高频SQL 50 题(基础版)第一题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第一题1757.可回收且低脂的产品题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a; 力扣高频SQL 50 题&#xff08;基础版&#xff09;第一题 1757.可回收且低脂的产品 题目说…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

Java之集合底层-数据结构

Java集合之数据结构 1 概述 数据结构是计算机科学中研究数据组织、存储和操作的一门学科。它涉及了如何组织和存储数据以及如何设计和实现不同的数据操作算法和技术。常见的据结构有线性数据结构&#xff08;含数组、链表、栈和队列等&#xff09;&#xff0c;非线性数据结构…

探索算法系列 - 双指针

目录 移动零&#xff08;原题链接&#xff09; 复写零&#xff08;原题链接&#xff09; 快乐数&#xff08;原题链接&#xff09; 盛最多水的容器&#xff08;原题链接&#xff09; 有效三角形的个数&#xff08;原题链接&#xff09; 查找总价格为目标值的两个商品&…

数据库表结构创建

一、原型图 二、分析 1、天气&#xff0c;值字段只有实测值&#xff0c;可用一个字段表示&#xff08;单位、来源同上&#xff09; 2、气温有默认值与实测值两个选项&#xff0c;一个字段无法表示默认值与实测值&#xff08;单位&#xff0c;来源同上&#xff09; 3、因为有…