IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ARM内核寄存器 和 基本汇编语言 -> 正文阅读

[嵌入式]ARM内核寄存器 和 基本汇编语言

对于嵌入式开发者来说,了解汇编语言和内核寄存器是对内核深入理解的基础


要讲 ARM 汇编语言,必须得先了解ARM的内核寄存器,内核处理所有的指令计算,都需要用到内核寄存器,所以ARM汇编里面指令大都是基于寄存器的操作。

文章前推荐韦东山老师的单片机核心视频,视频可以在韦东山老师官网里面找到:百问网

一、ARM内核寄存器

内核寄存器与外设寄存器:

内核寄存器与外设寄存器是完全不同的概念。
内核寄存器是指 CPU 内部的寄存器,CPU处理所有指令数据需要用到这些寄存器保存处理数据;
外设寄存器是指的 串口,SPI,GPIO口这些设备有关的寄存器。

在我的另一篇博文:FreeRTOS记录(三、FreeRTOS任务调度原理解析_Systick、PendSV、SVC)
内核中断管理 章节讲到过Cortex-M的寄存器的相关内容,这里我们再简单说明一下:

1.1 M3/M4内核寄存器

对于M3/M4而言:
在这里插入图片描述R13,栈指针(Stack Pointer)

  • R13寄存器中存放的是栈顶指针,M3/M4 的栈是向下生长的,入栈的时候地址是往下减少的。
  • 裸机程序不会用到PSP,只用到MSP,需要运行RTOS的时候才会用到PSP。
  • 堆栈主要是通过POP,PUSH指令来进行操作。在执行 PUSH 和 POP 操作时, SP 的地址寄存器,会自动调整。

R14 ,连接寄存器(Link Register)

  • LR 用于在调用子程序时存储返回地址。
    例如,在使用 BL(分支并连接, Branch and Link)指令时,就自动填充 LR 的值(执行函数调用的下一指令),进而在函数退出时,正确返回并执行下一指令。
    如果函数中又调用了其他函数,那么LR将会被覆盖,所以需要先将LR寄存器入栈。

  • 保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回

  • 当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断

R15,程序计数器(Program Count)

  • 在Cortex-M3中指令是3级流水线,出于对Thumb代码的兼容的考虑,读取pc时,会返回当前指令地址+4的值。
  • 读 PC 时返回的值是当前指令的地址+4,关于M3、M4 和 A7的 PC值的问题需要单独来解释一下

其中程序状态寄存器 XPSR:
在这里插入图片描述

程序状态寄存器,该寄存器由三个程序状态寄存器组成
应用PSR(APSR) : 包含前一条指令执行后的条件标志,比较结果:大于等于,小于,进位等等;
中断PSR(IPSR ) : 包含当前ISR的异常编号
执行PSR(EPSR) : 包含Thumb状态位

1.2 A7内核寄存器

对于 A7 而言:
在这里插入图片描述
A7的 R13、R14、R15 的作用和 M3/4类似。

需要注意的一点就是,对于A7而言R15,程序计数器(Program Count)有待确认):

  • 读 PC 时返回的值是当前指令的地址+8, PC 指向当前指令的下两条指令地址。
  • 由于ARM指令总是以字对齐的,故PC寄存器 bit[1:0] 总是00。

A7内核的程序状态寄存器 CPSR:
在这里插入图片描述

1.3 ARM中的PC指针的值

ARM7:

推荐一篇文章,是关于ARM7内核的(此部分转自此篇博文):

关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)

ARM处理器采用3级指令流水线:
在这里插入图片描述
一条汇编指令的运行有三个步骤,取指、译码、执行,当第一条汇编指令取指完成后,紧接着就是第二

条指令的取指,然后第三条。

第一条指令:add r0, r1,$5 取指完成后,PC就指向了第二条指令,此时PC=PC+4

当第一条指令译码完成以后,此时PC=PC+8

所以第一条指令开始执行时,PC值已经加了8

所以必须记住这个前提,在arm中,每次该指令执行时,其实这时的PC值是PC=PC+8

A7:(待更新)

M3/M4:(待更新)

二、汇编语言

ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),具体说明在下面这篇博文5.4小结有过说明:

STM32的内存管理相关(内存架构,内存管理,map文件分析)

2.1 汇编基础

最初,ARM公司发布了两类指令集:

  1. ARM指令集,32位的ARM指令,每条指令占据32位,高效,但是太占空间;
  2. Thumb指令集,16位的Thumb指令,每条指令占据16位,节省空间;

比如: MOV R0,R1 这条指令,可能是16位的,也可能是32位的

那么在汇编中是如何在 ARM 指令 和 Thumb 指令之间切换呢:

/*ARM指令 与 Thumb 指令 的切换*/

code 16  (表示下下面是 Thumb 指令)
...
...

(调用下面的B函数)
bx  B_addr(B的地址B_addr的bit0 = 0,表示跳转过去执行 ARM 指令)
A 函数
...

code 32  (表示下下面是 ARM 指令)
...
...
B 函数
(回到上面的A函数)
bx  A_addr + 1 (A的地址A_addr的bit0 = 1,表示跳转过去执行 Thumb 指令)
...

/**********************/

对于A7、ARM7、ARM9 内核而言它们支持 16位的Thumb 指令集 和 32位的 ARM 指令集

对于M3、M4 内核而言它们支持的是 Thumb2 指令集,它支持16位、32位指令混合编程

对于内核来说使用的是 ARM指令集 还是 Thumb指令集,就是在 XPSR 和 CPSR

在M3/M4中, XPSR 寄存器的 T(bit24):1表示 Thumb指令集
在这里插入图片描述
根据上面所述,M3是使用的 Thumb2 指令集,所以会有 T 总是 1.

在A7中 CPSR中的:T(bit5) :控制指令执行状态,表明本指令是 ARM 指令还是 Thumb 指令

2.2 汇编指令

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:53:12  更:2021-12-11 15:55:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:34:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码