基于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

    shell 复制代码
    # 示例
     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

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

可以这样记汇编指令的 读内存、写内存:

读:目的<-----------源

写:源----------->目的
箭头是从"源"指向"目的",只需要记住箭头方向即可。

  • 加减

    shell 复制代码
    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
  • 比较

    shell 复制代码
    CMP R0, R1  ;  结果保存在PSR(程序状态寄存器)

CMP 表示compare,比较R0、R1

  • 跳转

    shell 复制代码
    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生成反汇编:

制作反汇编的指令如下:

shell 复制代码
fromelf  --text  -a -c  --output=xxx.dis  xxx.axf

反汇编:

相关推荐
蒸蒸yyyyzwd3 小时前
AI应用相关可能的面试问题
笔记
叼烟扛炮4 小时前
[Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南
linux·运维·笔记·git·学习
蒸蒸yyyyzwd4 小时前
学习笔记 八股手撕
笔记·学习
起个网名真难~5 小时前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
揣一尾游鱼yu6 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
水饺编程7 小时前
第2章:Linux 基础,解压缩【.tar.bz2】压缩包文件
linux·c语言·汇编
留岁7 小时前
大模型推理部署 · 学习文档
学习
Zevalin爱灰灰7 小时前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
小李不想当小白7 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
陈飞EXCEL9 小时前
北京杰飞 IT 旗下妙码生花少儿Python编程上线两大学习系统
开发语言·python·学习