ARM-v8架构属于64位架构,向下兼容ARM-v7架构。ARM-v8架构支持两种类型的ARM指令集,一种是Aarch64位指令集,一种是Aarch32位指令集。不管是那种类型的指令集,每条指令依然都是字(4字节)对齐。两种类型指令集的本质区别是工作寄存器的位数不同,Aarch32位指令集使用32bit工作寄存器,二Aarch64位指令集使用64bit工作寄存器。
寄存器名称描述
| 位宽 | 分类 | ||
| 32-bit | Wn(通用) | WZR(0寄存器) | WSP(堆栈指针) |
| 64-bit | Xn(通用) | XZR(0寄存器) | SP(堆栈指针) |
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 |
热点新闻
返回
讲师博文
ARM-v8架构属于64位架构,向下兼容ARM-v7架构。ARM-v8架构支持两种类型的ARM指令集,一种是Aarch64位指令集,一种是Aarch32位指令集。不管是那种类型的指令集,每条指令依然都是字(4字节)对齐。两种类型指令集的本...
ARM-v8架构属于64位架构,向下兼容ARM-v7架构。ARM-v8架构支持两种类型的ARM指令集,一种是Aarch64位指令集,一种是Aarch32位指令集。不管是那种类型的指令集,每条指令依然都是字(4字节)对齐。两种类型指令集的本质区别是工作寄存器的位数不同,Aarch32位指令集使用32bit工作寄存器,二Aarch64位指令集使用64bit工作寄存器。
寄存器名称描述
| 位宽 | 分类 | ||
| 32-bit | Wn(通用) | WZR(0寄存器) | WSP(堆栈指针) |
| 64-bit | Xn(通用) | XZR(0寄存器) | SP(堆栈指针) |
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 |
相关推荐
全国咨询热线:400-611-6270
?2004-2018华清远见教育科技集团 版权所有 京ICP备16055225号 京公海网安备11010802025203号