ARM体系结构学习


The Arm architecture is a Reduced Instruction Set Computer (RISC) architecture with the following RISC architecture features:
A large uniform register file.
A load/store architecture, where data-processing operations only operate on register contents, not directly on
memory contents.
Simple addressing modes, with all load/store addresses determined from register contents and instruction
fields only.

From ChatGPT:
ARM的A、R、M系列是指ARM处理器的不同架构系列,它们有以下区别:
A系列:该系列处理器是基于ARMv7架构的应用处理器系列,适用于高性能的应用场景,如智能手机、平板电脑和嵌入式系统。A系列处理器支持32位和64位指令集,并提供丰富的功能和扩展性。
R系列:该系列处理器是针对实时系统的嵌入式应用而设计的,具有较高的可靠性和可用性要求。R系列处理器适用于汽车电子、工业自动化和航空航天等领域,提供硬实时性能和严格的安全性。
M系列:该系列处理器是为低功耗嵌入式系统而设计的,旨在提供高效的能耗管理和丰富的外设支持。M系列处理器适用于物联网(IoT)设备、传感器、医疗设备等资源受限的领域,提供低功耗和实时性能。
总体而言,A系列处理器主要面向高性能的应用场景,具有较大的指令集和功能集,适合处理复杂的计算任务。R系列处理器主要面向实时系统,注重可靠性和安全性。M系列处理器则专注于低功耗和资源受限的嵌入式系统,适合于物联网和低功耗设备。

数据类型

在x86上字是16bits,双字是32bits,arm上字是32bits,双字是64bits
1,整型
Byte 8bits
Halfword 16bits
Word 32bits
DoubleWord 64bits
Quadword 128bits
2,浮点
Half-precision
Sigle-precision
Double-precision
BFloat16

支持的内存模型

  • 对未对齐的内存访问生成异常。
  • 限制应用程序对指定内存区域的访问。
  • 将执行指令提供的虚拟地址(VA)转换为物理地址(PA)。
  • 更改big-endian和little-endian之间多字节数据的解释
  • 控制对内存的访问顺序。
  • 控制缓存和地址转换结构。
  • 同步多个PE对共享内存的访问。
  • 控制和阻止对内存的推测性访问的屏障

PE:在Aarch64架构中,PE代表"Processing Element",它是指处理器核心或计算单元。Aarch64架构是ARMv8指令集的64位版本,其中的PE表示一个64位的处理器核心。
每个Aarch64处理器核心(PE)是一个独立的计算单元,它包含指令解码器、执行单元、寄存器文件等组件,用于执行指令、处理数据和执行各种计算操作。PE可以独立地执行指令流,具有自己的寄存器状态和控制逻辑。
Aarch64架构支持多核处理器,每个核心(PE)可以独立地执行不同的任务,从而实现并行计算和提高系统性能。多个PE之间可以通过内部或外部总线进行通信和协调,以实现任务的分配、数据共享等操作。
在Aarch64架构中,每个PE通常包含多级流水线(pipeline)、多个执行单元和数据通路,以支持高效的指令执行和数据处理。PE还可能包含浮点处理单元(Floating-Point Unit,FPU)和SIMD(Single Instruction, Multiple Data)单元,用于执行浮点运算和向量化操作。
总之,Aarch64的PE代表处理器核心,是Aarch64架构中的基本计算单元,用于执行指令和处理数据。多个PE可以组成多核处理器,以提供更高的计算能力和并行处理能力。

寄存器

概述

学习A64指令集,基于Armv8-A架构也就是aarch64。

  • 31个64位通用寄存器,其中X30是程序链接急促器
  • 一个64位PC,SP,和ELR(Exception Link Register)
  • 32个128位寄存器支持ASIMD(Advanced SIMD)和浮点运算
  • 通过单个指令集A64
  • 定义了四个异常模式EL0-EL3
  • 支持64位虚拟地址
  • 一系列处理器状态
  • 使用后缀命名每个系统寄存器,该后缀表示可以访问寄存器的最低异常级别。

SIMD代表单指令多数据(Single Instruction, Multiple Data),它是一种计算机指令集架构的扩展,旨在并行处理多个数据元素。SIMD架构允许在一条指令中同时操作多个数据元素,从而实现数据并行性和向量化计算。
在SIMD架构中,相同的操作同时应用于一组数据元素,这些数据元素通常以向量或矩阵形式组织。SIMD指令可以在单个时钟周期内同时处理多个数据元素,从而提高并行计算的效率和性能。
SIMD广泛应用于多媒体处理、图像处理、向量计算、信号处理和科学计算等领域,其中大规模数据并行处理是关键需求。一些常见的SIMD指令集包括MMX(多媒体扩展)、SSE(流式SIMD扩展)、AVX(高级向量扩展)和NEON(ARM架构的SIMD扩展)等。
通过使用SIMD指令集,可以在不增加额外的硬件成本的情况下提高并行计算的效率,从而加快处理速度、降低功耗并提高系统性能。然而,要实现有效的SIMD并行计算,需要编写针对SIMD指令集优化的代码,并合理利用数据级并行性和向量化计算的特性。

通用寄存器
X0 – X7 参数和返回值
X8 – X18 临时寄存器(调用者保存的寄存器)
X19 – X28 被调用者保存的寄存器
X29 帧指针
X30 链接寄存器
SP 堆栈指针
其他需要关注的寄存器
ZXR、WZR始终是0并且不可写
PC不可以用于数据处理,可以使用下面指令间接获取当前PC:
ADR Xd,.
这里的点".",指这儿。
系统寄存器
用于配置处理器,控制系统(比如MMU、异常处理)。不可以通过数据处理指令,load/store指令直接使用,只能使用专门的指令,读取(MRS)到X寄存器,然后操作完再写回(MSR)。
MRS Xd,
reads the system register into Xd.
MSR , Xn
write Xnto the system register.
系统寄存器只能通过名字来指定,比如:
MRS X0, SCTLR_EL1
reads SCTLREL1 into X0
系统寄存器的名字已_ELx作为后缀,这个后缀制定了方位寄存器的最小特权级别

常见系统寄存器:
1,程序状态寄存器(Program Status Registers,PSRs):
CPSR:当前程序状态寄存器
SPSR_EL1、SPSR_EL2、SPSR_EL3:异常级别切换时保存的程序状态寄存器
2,系统控制寄存器(System Control Registers):
SCTLR_EL1、SCTLR_EL2、SCTLR_EL3:系统控制寄存器,控制处理器的系统级行为
CPACR_EL1、CPTR_EL2、CPTR_EL3:协处理器访问控制寄存器,控制协处理器的访问权限
3,中断控制寄存器(Interrupt Control Registers):
ICC_EL1、ICCEL2、ICC*_EL3:中断控制寄存器,用于处理器间的中断控制
4,时钟寄存器(Timer Registers):
CNTFRQ_EL0、CNTKCTL_EL1、CNTP_CTL_EL0、CNTP_CVAL_EL0 等:用于处理器计时和定时器控制
5,MMU 相关寄存器:
TTBR0_EL1、TTBR1_EL1:页表基址寄存器,用于地址翻译
TCR_EL1、TCR_EL2、TCR_EL3:转换控制寄存器,控制虚拟地址到物理地址的转换规则

条件标志

FlagDescription
N如果运算结果为负则置位。如果结果为正或零则清除。
Z如果运算结果为零/等于则设置。如果非零/不等于则清除。
C如果指令导致进位或溢出则置位。如果没有进位则清零。
V如果指令导致溢出则置位。如果没有溢出则清零。

条件代码

在这里插入图片描述
SP的对齐方式必须是指针大小的两倍。aarch64是16字节。

A64指令集

armv8-a是一种加载/存储架构,数据处理和x86不一样(直接对内存中的数据进行操作)。arm数据首先加载到寄存器,进行修改,然后存储会内存中,或者在不再需要时将其丢弃。一般格式,如下图:
Instruction Rd,Rn,Operand2
Rd目标寄存器,Rn被操作的寄存器,R表示寄存器可以是X或W寄存器。Operand2可能是寄存器、修改的寄存器或立即数。
operation,是指指令需要做什么,比如加,减,与等。后面加上s代表会根据计算结果更新条件标记。
在这里插入图片描述

算数指令

用于算术,堆栈分配和内存寻址、控制流、寄存器或变量初始化
在这里插入图片描述

逻辑运算和移动

主要用于测试和转换。可以用逻辑左移LSL执行乘法,逻辑右移LSR执行除法,按位AND执行模运算。此时乘数和除数必须是2的幂。
在这里插入图片描述

加载、存储和寻址

用于加载和存储数据。
在这里插入图片描述

条件选择指令

这些指令根据条件标志的当前状态在第一或第二源寄存器之间进行选择。当指定的条件为真时,将选择第一个源寄存器,并将其值复制到目标寄存器而不进行修改,当条件为假时,选择第二个源寄存器,并且在写入目标寄存器之前,可以选择其值反转、取反或加1.
CSEL和C语言的三目运算符一样。
在这里插入图片描述

位操作

这些指令中的大多数旨在将位从一个寄存器提取或移动到另一个寄存器。当处理器要保留目标寄存器内容、零或符号扩展的字节或字时,很有用。
在这里插入图片描述
在这里插入图片描述
REEV16he RBIT在处理大小端转换的时候非常有用
在这里插入图片描述
位扩展
在这里插入图片描述

分支

分支指令使用条件标志或通用寄存器的值来更改执行流程。在x86中称为“跳转”。调用子例程后测试 TRUE 或 FALSE 非常常见,因此使用TBZ/TBNZ和CBZ/CBNZ等条件分支指令非常有意义。在 x86 上唯一接近这些的指令是JCXZ,如果 CX 寄存器的值为零,则 JCXZ 会跳转。然而,x86 子例程通常在累加器 (AX) 中返回结果,而计数器寄存器 (CX) 通常用于迭代/循环。
在这里插入图片描述

系统指令

aarch64中的特权级别,被称为异常级别(Exception Level,EL),共分4的等级
在这里插入图片描述
通过MSR修改特殊寄存器nzcv(允许读取和写入称为NZCV的条件标志)

NZCV 寄存器是 ARM 架构中用于存储条件标志位(Condition Flags)的寄存器。它是一个 32 位的寄存器,每个位代表一个条件标志位,具体定义如下:
N (Negative) 标志位,位于第 31 位,用于表示运算结果是否为负数。当运算结果为负数时,N 标志位被设置为 1,否则为 0。
Z (Zero) 标志位,位于第 30 位,用于表示运算结果是否为零。当运算结果为零时,Z 标志位被设置为 1,否则为 0。
C (Carry) 标志位,位于第 29 位,用于表示无符号数运算是否产生进位或借位。当无符号数运算产生进位时,C 标志位被设置为 1,否则为 0。
V (Overflow) 标志位,位于第 28 位,用于表示有符号数运算是否产生溢出。当有符号数运算产生溢出时,V 标志位被设置为 1,否则为 0。
这些标志位通常用于条件分支和比较指令,以根据运算结果或先前的条件设置来决定程序的执行路径。程序可以读取 NZCV 寄存器的值来进行条件判断,并根据需要修改它们的值来影响程序的执行行为。

 // 读取条件标志
  .equ  OVERFLOW_FLAG ,  1  <<  28 
  .equ  CARRY_FLAG ,     1  <<  29 
  .equ  ZERO_FLAG ,      1  <<  30 
  .equ  NEGATIVE_FLAG ,  1  <<  31 
  mrs     x0 ,  nzcv 
  // 设置 C 标志
  mov     w0 ,  CARRY_FLAG 
  msr     nzcv ,  x0

汇编中常用预处理指令

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值