ARM相关的基础概念和寄存器

目录

1、机器码

2、汇编指令

3、汇编指令集

4、架构

5、内核(CPU中的核心)

6、处理器

[7、复杂指令集和精简指令集 7.1复杂指令集](#7、复杂指令集和精简指令集 7.1复杂指令集)

7.2精简指令集

7.3修改

8、内核中的寄存器阻值

8.1溜达存储类型

8.2、AMR处理器(内核)的工作模式

8.2.1Cortex-M核的工作模式

8.2.2Cortex-A核的工作模式

8.3寄存器组织​编辑

9、特殊功能寄存器

9.1R13寄存器(SP寄存器)


1、机器码

机器码:就是计算器或者机器能够识别以0和1组成的二进制编码格式

gcc分布编译分为:预处理、编译、汇编、链接。汇编:将汇编文件转化为二进制文件

2、汇编指令

汇编指令:就是一条具备特殊功能的指令

gcc分布编译分为:预处理、编译、汇编、链接。编译:将c语言转化为汇编文件

3、汇编指令集

汇编指令集:就是多条不同功能的汇编指令组成的集合

汇编指令集的分类:

x86-64汇编指令集

ARM汇编指令集

ZEN汇编指令集

PowerPC汇编指令集

RISC-V汇编指令集。。。。

4、架构

架构:就是汇编指令集的别名,通过不同的汇编指令集可以设计出不同的架构

架构:

x86-64架构、arm架构、Mips架构、RISC-V架构.....

5、内核(CPU中的核心)

不同的架构可以设计出不同的内核

arm-v1~v6架构:目前已经淘汰

arm-v7架构:支持32位汇编指令集(ARM课程所使用的STM32MP157AAA这款芯片就是通过arm-v7架构设计而来的)

arm-v8架构:支持64位汇编指令集,向下兼容32位汇编指令集

arm-v9架构:最新的架构,主要应用在性能要求比较高的设备上

基于arm-v7架构设计出了Cortex-M4内核

基于arm-v8架构设计出了Cortex-A9内核

基于arm-v9架构设计出了Cortex-X5内核

ARM公司设计的内核分类:

Cortex-M系列内核(M3、M4、M33......) ------ 应用在功能相对简单(低功耗产品) Cortex-A系列内核(A7、A8、A9......) ------ 之前应用在手机、电脑上

Cortex-R系列内核 ------ 应用在对实时性要求比价高的产品上

Cortex-X系列内核 ------ 最新的、性能最高的系列

ARM课程使用的芯片:STM32MP157AAA芯片 = Cortex-A7核 + Cortex-M4核

单片机课程使用的芯片:STM32U575RIT6芯片 = Cortex-M33内核

6、处理器

CPU:中央处理器

MCU:微控制单元(微控制器),是指传统意义上的单片机,不支持使用操作系统(目前使用小型的实时操作系统),性能比较低(功耗低)

MPU:微处理单元(微处理器),是高性能的处理器,支持使用操作系统

SOC:system on-chip(片上系统)
问题(mcu和mpu的区别上面红色字体)
问题,使用过哪些MCU?
STM32F103、STM32F407、STM32MP157A、STM32U575...

STM32MP157AAA的组成:

ST:公司名字

M:MCU(微控制器)

32:支持32位的汇编指令集

MP1XX:芯片型号(MPI系列:MP157、MP158...)

AAA:芯片性能

7、复杂指令集和精简指令集

7.1复杂指令集

复杂指令集:他的汇编指令的指令长度和指令周长是不固定的

指令宽度:是每条指令占用内存空间的大小

指令周长:是每条指令被执行需要的时间

X86汇编指令集是复杂指令集

反汇编终端指令:objdump

作用是将二进制编码格式的文件转换为汇编指令格式的文件

7.2精简指令集

精简指令集下的汇编指令的指令周长和指令宽度是固定的
arm汇编指令集、Mips汇编指令集、RISC-V汇编指令集、PowerPC汇编指令集...这些都是精简指令集

arm汇编指令集存在很多的子集,这些子集中会存在一个Thumb汇编指令集

Thumb汇编指令集是arm汇编指令集的子集,在默认状态时,会选择使用Thumb汇编指令 Thumb汇编指令集大小为16位,也就是Thumb汇编指令集下的汇编指令的指令宽度都是16位(2个字节)

arm汇编指令集大小为32位,也就是arm汇编指令集下的汇编指令的指令宽度都是32位(4个字节)

在使用Cortex-M内核,大多使用Thumb汇编指令集

在使用Cortex-A内核,大多使用ARM汇编指令集

7.3修改

为什么修改:因为精简指令集的宽度和大小是固定的而上图却有一个是四字节大小的所以要修改
为什么会出现这个四字节的:
1、指令集扩展:为实现复杂功能(如 `ldr.w` 宽加载),需更多编码信息,会出现 4 字节指令;
2、 混合模式:像 ARM 同时支持 32 位(ARM 指令集)和 16 位(Thumb 指令集),复杂操作会调用 4 字节的 ARM 指令;
3、架构演进:新指令为兼容/优化(如多媒体、内存管理),也可能设计为 4 字节,平衡功能与编码空间。 本质是"固定基础 + 灵活扩展",满足多样需求~
通过下面的图就修改好了

8、内核中的寄存器阻值

8.1溜达存储类型

六大存储类型:auto、static、const、extern、volatile、register。

register(寄存器存储类型): 使用register修饰变量时,变量会被直接存储到核内寄存器中 无法通过内存地址进行访问,只能通过寄存器编号进行访问 访问速度快,寄存器个数有限

volatile: 防止编译器对代码进行优化,直接从内存中取最新的值

应用场景:

1、多线程使用同一资源时

2、单片机开发中

定义变量的流程:
存储类型 + 数据类型 + 变量名;

计算机原理中,计算机的组成部分: 输入设备、输出设备、CPU(控制器、运算器、寄存器/存储器)
register(寄存器存储类型):变量会被直接被定义到寄存器中,只能通过寄存器访问

volatile:修饰的变量不使用高速缓存(DCache)去暂存数据,而是直接和内核进行数据交互
为什么加volatile:因为你不加的话存在隐患,a会被数据高速缓存区(DCarche)暂存,而线程1/2/3访问a时,可能会读取缓存区的旧值而非最新值,线程的1/2都改了a,但因为缓存的存在导致线程3的c=a+1中的a可能拿的是旧值,结果会混乱。
而加上volatile:直接跳过缓存直接链接内存,强制每次读写操作都直接操作内存,可以读到最新的数据,无论哪个线程修改 a的值,其他线程能立刻看到内存里的最新值,避免因缓存 "藏着旧数据" 导致计算错误(比如线程 3 能拿到线程 1/2 改过的 a,而非缓存旧值 )。

8.2AMR处理器(内核)的工作模式

8.2.1Cortex-M核的工作模式

M核的工作模式:

1、线程模式

2、异常模式

8.2.2Cortex-A核的工作模式

非特权模式:

User模式(用户模式,执行用户代码)

特权模式:

非异常模式:Sys模式(系统模式,管理员模式)

异常模式:

IRQ模式(普通中断异常模式)

FIQ模式(快速中断异常模式)

SVC模式(超级管理异常模式)

ABT模式(访问中止异常模式)

UDF/UNF模式(未定义异常模式)

以上工作模式是使用ARM-v7架构的工作模式

在引入ARM-v8架构之后,又设计出了两种工作模式

MON模式(安全监管模式)

HYP模式(虚拟化技术模式)

8.3寄存器组织

根据上图可知:
1、每一个格子是一个寄存器,每一个寄存器的大小都是4字节
2、黑色字体的寄存器是实际的寄存器(不是灰色的),灰色字体的是实际不存在的寄存器
3、白色底的寄存器是公用寄存器,蓝色底的寄存器是私有寄存器(只有在特定的模式下才可以使用)
4、实际上可以操作的寄存器只有43个(大小为43*4)可看下图
5、上述的寄存器均为核内寄存器(无法通过内存地址进行访问,只能通过寄存器编号访问R0,R1....)
核外寄存器可以通过内存地址进行访问

9、特殊功能寄存器

9.1R13寄存器(SP寄存器)

R13寄存器-----SP寄存器-------the stack pointer寄存器

SP寄存器的中文名字叫作栈指针寄存器

SP寄存器的作用:用于保存栈区的一片内存空间地址

SP:就是将图片上的r1和r2寄存器中的值保存到SP栈指针寄存器的一片栈空间地址上

LR:R14寄存器-------LR寄存器------特和linkingregister

LR寄存器的中文名是链接寄存器

LR寄存器的作用是:用于保存函数的返回地址

如上图:LR存储了函数的返回地址,func函数的返回地址就是这个函数的下一条命令

R15寄存器----PC寄存器-----特和program counter register

PC寄存器的中文名字是程序计数寄存器

PC寄存器的作用:用于保存下一条需要执行的汇编指令的地址

就是执行一条命令回到0x0f,就是PC=LR
SP寄存器 ---- 用于保存栈空间的一片地址----实现c语言中的局部变量

LR寄存器-----用于保存函数的返回地址-----用于实现c语言中的函数返回------|------综合使用实现函数之间的跳转

PC寄存器-----用于保存下一条需要执行的汇编指令的地址 ------用于实现c语言语句的一条一条指令

相关推荐
17(无规则自律)5 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞18 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣2 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣2 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发