ARM-v8是在32位ARM架构上进行开拓的,将被首先用于对扩展虚拟地址和64位数据处理技能有更高哀求的产品领域,如企业运用、高档消费电子产品。
ARMv8架构包含两个实行状态:AArch64和AArch32。AArch64实行状态针对64位处理技能,引入了一个全新指令集A64;而AArch32实行状态将支持现有的ARM指令集。目前的ARMv7架构的紧张特性都将在ARMv8架构中得以保留或进一步拓展,如:TrustZone技能、虚拟化技能及NEON advanced SIMD技能,等。
合营ARMv8架构的推出,ARM正在努力确保一个强大的设计生态系统来支持64位指令集。ARM的紧张互助伙伴已经能够得到支持ARM-v8架构的ARM编译器和快速模型(Fast Model)。在新架构的支持下,对一系列开源操作系统、运用程序和第三方工具的初始开拓已经在开展中。通过互助,ARM互助伙伴们共同加速64位生态系统的开拓,在许多情形下,这可视为是对现有支持基于ARMv7架构产品的广泛生态系统的自然延伸。

ARM-v8架构属于64位架构,向下兼容ARM-v7架构。ARM-v8架构支持两种类型的ARM指令集,一种是Aarch64位指令集,一种是Aarch32位指令集。不管是那种类型的指令集,每条指令依然都是字(4字节)对齐。两种类型指令集的实质差异是事情寄存器的位数不同,Aarch32位指令集利用32bit事情寄存器,而Aarch64位指令集利用64bit事情寄存器。
ARMv8 供应AArch32 state和 AArch64 state 两种Execution State,下面是两种Execution State比拟.
Execution State
Note
AArch32
供应13个32bit通用寄存器R0-R12,一个32bit PC指针 (R15)、堆栈指针SP (R13)、链接寄存器LR (R14)
供应一个32bit非常链接寄存器ELR, 用于Hyp mode下的非常返回
供应32个64bit SIMD向量和标量floating-point支持
供应两个指令集A32(32bit)、T32(16/32bit)
兼容ARMv7的非常模型
协处理器只支持CP10\CP11\CP14\CP15
AArch64
供应31个64bit通用寄存器X0-X30(W0-W30),个中X30是程序链接寄存器LR
供应一个64bit PC指针、堆栈指针SPx 、非常链接寄存器ELRx
供应32个128bit SIMD向量和标量floating-point支持
定义ARMv8非常等级ELx(x<4),x越大等级越高,权限越大
定义一组PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE当前的状态信息
没有协处理器观点
AArch32主要寄存器
寄存器类型
Bit
描述
R0-R14
32bit
通用寄存器,但是ARM不建议利用有分外功能的R13,R14,R15当做通用寄存器利用.
SP_x
32bit
常日称R13为堆栈指针,除了User和Sys模式外,其他各种模式下都有对应的SP_x寄存器:x ={ und/svc/abt/irq/fiq/hyp/mon}
LR_x
32bit
称R14为链接寄存器,除了User和Sys模式外,其他各种模式下都有对应的SP_x寄存器:x ={ und/svc/abt/svc/irq/fiq/mon},用于保存程序返回链接信息地址,AArch32环境下,也用于保存非常返回地址,也就说LR和ELR是公用一个,AArch64下是独立的.
ELR_hyp
32bit
Hyp mode下特有的非常链接寄存器,保存非常进入Hyp mode时的非常地址
PC
32bit
常日称R15为程序打算器PC指针,AArch32 中PC指向取指地址,是实行指令地址+8,AArch64中PC读取时指向当前指令地址.
CPSR
32bit
记录当前PE的运行状态数据,CPSR.M[4:0]记录运行模式,AArch64下利用PSTATE代替
APSR
32bit
运用程序状态寄存器,EL0下可以利用APSR访问部分PSTATE值
SPSR_x
32bit
是CPSR的备份,除了User和Sys模式外,其他各种模式下都有对应的SPSR_x寄存器:x ={ und/svc/abt/irq/fiq/hpy/mon},把稳:这些模式只适用于32bit运行环境
HCR
32bit
EL2特有,HCR.{TEG,AMO,IMO,FMO,RW}掌握EL0/EL1的非常路由
SCR
32bit
EL3特有,SCR.{EA,IRQ,FIQ,RW}掌握EL0/EL1/EL2的非常路由,把稳EL3始终不会路由
VBAR
32bit
保存任意非常进入非Hyp mode & 非Monitor mode的跳转向量基地址
HVBAR
32bit
保存任意非常进入Hyp mode的跳转向量基地址
MVBAR
32bit
保存任意非常进入Monitor mode的跳转向量基地址
ESR_ELx
32bit
保存非常进入ELx时的非常综合信息,包含非常类型EC等,可以通过EC值判断非常class
PSTATE
不是一个寄存器,是保存当前PE状态的一组寄存器统称,个中可访问寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},属于ARMv8新增内容,紧张用于64bit环境下
A32状态下寄存器组织
• 所谓的banked register 是指一个寄存器在不同模式下有对应不同的寄存器,比如SP,在abort模式下是SP_bat,在Und模式是SP_und,在iqr模式下是SP_irq等,进入各种模式后会自动切换映射到各个模式下对应的寄存器.
• R0-R7是所谓的非banked register,R8-R14是所谓的banked register
4.1.1 T32状态下寄存器组织
A32利用
Rd/Rn编码位宽4位
T32-32bit利用
Rd/Rn编码位宽4位
T32-16bit利用
Rd/Rn编码位宽3位
R0
R0
R0
R1
R1
R1
R2
R2
R2
R3
R3
R3
R4
R4
R4
R5
R5
R5
R6
R6
R6
R7
R7
R7
R8
R8
并不是说T32-16bit下没有R8~R12,而是有限的指令才能访问到,16bit指令的Rd/Rn编码位只有3位,以是Rx范围是R0-R7
R9
R9
R10
R10
R11
R11
R12
R12
SP (R13)
SP (R13)
SP (R13)
LR (R14)
LR (R14) //M
LR (R14) //M
PC (R15)
PC (R15) //P
PC (R15) //P
CPSR
CPSR
CPSR
SPSR
SPSR
SPSR
AArch64主要寄存器
寄存器类型
Bit
描述
X0-X30
64bit
通用寄存器,如果有须要可以当做32bit利用:WO-W30
LR (X30)
64bit
常日称X30为程序链接寄存器,保存跳转返复书息地址
SP_ELx
64bit
若PSTATE.M[0] ==1,则每个ELx选择SP_ELx,否则选择同一个SP_EL0
ELR_ELx
64bit
非常链接寄存器,保存非常进入ELx的非常地址(x={0,1,2,3})
PC
64bit
程序计数器,俗称PC指针,总是指向即将要实行的下一条指令
SPSR_ELx
32bit
寄存器,保存进入ELx的PSTATE状态信息
NZCV
32bit
许可访问的符号标志位
DIAF
32bit
中断使能位:D-Debug,I-IRQ,A-SError,F-FIQ ,逻辑0许可
CurrentEL
32bit
记录当前处于哪个Exception level
SPSel
32bit
记录当前利用SP_EL0还是SP_ELx,x= {1,2,3}
HCR_EL2
32bit
HCR_EL2.{TEG,AMO,IMO,FMO,RW}掌握EL0/EL1的非常路由 逻辑1许可
SCR_EL3
32bit
SCR_EL3.{EA,IRQ,FIQ,RW}掌握EL0/EL1/EL2的非常路由 逻辑1许可
ESR_ELx
32bit
保存非常进入ELx时的非常综合信息,包含非常类型EC等.
VBAR_ELx
64bit
保存任意非常进入ELx的跳转向量基地址 x={0,1,2,3}
PSTATE
不是一个寄存器,是保存当前PE状态的一组寄存器统称,个中可访问寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},属于ARMv8新增内容,64bit下代替CPSR
64、32位寄存器的映射关系
64-bit
32-bit
64-bit OS
Runing
AArch32 App
64-bit
32-bit
X0
R0
X20
LR_adt
X1
R1
X21
SP_abt
X2
R2
X22
LR_und
X3
R3
X23
SP_und
X4
R4
X24
R8_fiq
X5
R5
X25
R9_fiq
X6
R6
X26
R10_fiq
X7
R7
X27
R11_fiq
X8
R8_usr
X28
R12_fiq
X9
R9_usr
X29
SP_fiq
X10
R10_usr
X30(LR)
LR_fiq
X11
R11_usr
SCR_EL3
SCR
X12
R12_usr
HCR_EL2
HCR
X13
SP_usr
VBAR_EL1
VBAR
X14
LR_usr
VBAR_EL2
HVBAR
X15
SP_hyp
VBAR_EL3
MVBAR
X16
LR_irq
ESR_EL1
DFSR
X17
SP_irq
ESR_EL2
HSR
X18
LR_svc
X19
SP_svc
ARMv8指令集
• A64指令集
• A32 & T32指令集
• 指令编码基本格式
<Opcode>{<Cond>}<S> <Rd>, <Rn> {,<Opcode2>}
• 个中尖括号是必须的,花括号是可选的
• A32: Rd => {R0–R14}
• A64: Rd =>Xt => {X0–X30}
标识符
Note
Opcode
操作码,也便是助记符,解释指令须要实行的操作类型
Cond
指令实行条件码,在编码中占4bit,0b0000 -0b1110
S
条件码设置项,决定本次指令实行是否影响PSTATE寄存器相应状态位值
Rd/Xt
目标寄存器,A32指令可以选择R0-R14,T32指令大部分只能选择RO-R7,A64指令可以选择X0-X30 or W0-W30
Rn/Xn
第一个操作数的寄存器,和Rd一样,不同指令有不同哀求
Opcode2
第二个操作数,可以是立即数,寄存器Rm和寄存器移位办法(Rm,#shit)
指令分类
类型
Note
• 跳转指令
条件跳转、无条件跳转(#imm、register)指令
• 非常产生指令
系统调用类指令(SVC、HVC、SMC)
• 系统寄存器指令
读写系统寄存器,如 :MRS、MSR指令 可操作PSTATE的位段寄存器
• 数据处理指令
包括各种算数运算、逻辑运算、位操作、移位(shift)指令
• load/store
内存访问指令
load/store {批量寄存器、单个寄存器、一对寄存器、非-暂存、非特权、独占}以及load-Acquire、store-Release指令 (A64没有LDM/STM指令)
• 协处理指令
A64没有协处理器指令
A64指令集
• A64指令编码宽度固定32bit
• 31个(X0-X30)个64bit通用用场寄存器(用作32bit时是W0-W30),寄存器名利用5bit编码
• PC指针不能作为数据处理指或load指令的目的寄存器,X30常日用作LR
• 移除了批量加载寄存器指令 LDM/STM, PUSH/POP, 利用STP/LDP 一对加载寄存器指令代替
• 增加支持未对齐的load/store指令立即数偏移寻址,供应非-暂存LDNP/STNP指令,不须要hold数据到cache中
• 没有供应访问CPSR的单一寄存器,但是供应访问PSTATE的状态域寄存器
• 比较A32少了很多条件实行指令,只有条件跳转和少数数据处理这类指令才有条件实行.
• 支持48bit虚拟寻址空间
• 大部分A64指令都有32/64位两种形式
• A64没有协处理器的观点
指令助记符
整型
W/R
32bit整数
X
64bit整数
加载/存储、符号-0扩展
B
无符号8bit字节
SB
带符号8bit字节
H
无符号16bit半字
SH
带符号16bit半字
W
无符号32bit字
SW
带符号32bit字
P
Pair(一对)
寄存器宽度改变
H
高位(dst gets top half)
N
有限位(dst < src)
L
Long (dst > src)
W
Wide (dst==src1,src1>src2) ?
指令条件码
编码
助记符
描述
标记
0000
EQ
运算结果相等为1
Z==1
0001
NE
运算结果不等为0
Z==0
0010
HS/CS
无符号高或者相同进位,发生进位为1
C==1
0011
LO/CC
无符号低清零,发生借位为0
C==0
0100
MI
负数为1
N==1
0101
PL
非负数0
N==0
0110
VS
有符号溢出为1
V==1
0111
VC
没用溢出为0
V==0
1000
HI
无符号 >
C==1 && Z==0
1001
LS
无符号 <=
!(C==1 && Z==0)
1010
GE
带符号 >=
N==V
1011
LT
带符号 <
N!=V
1100
GT
带符号 >
Z==0 && N==V
1101
LE
带符号 <=
!( Z==0 && N==V)
1110
AL
无条件实行
Any
嵌入式物联网须要学的东西真的非常多,千万不要学错了路线和内容,导致人为要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!
某鱼上买估计至少要好几十。
点击这里找小助理0元领取:加微信领取资料