历史上的今天
返回首页

历史上的今天

今天是:2024年11月25日(星期一)

正在发生

2021年11月25日 | ARMv8-AArch64寄存器和指令集

2021-11-25 来源:eefocus

(一)简述

AArch拥有31个通用寄存器,系统运行在64位状态下的时候名字叫Xn,运行在32位的时候就叫Wn;

这里写图片描述

AArch32与AArch64寄存器对应关系:

这里写图片描述

(二)PSTATE



PSTATE不是一个寄存器,它表示的是保存当前process状态信息的一组寄存器或者一些标志位信息的统称,当异常发生的时候这些信息就会保存到EL所对应的SPSR寄存器当中;


寄存器:

这里写图片描述

标志位:


type ProcState is (

bits (1) N, // Negative condition flag

bits (1) Z, // Zero condition flag

bits (1) C, // Carry condition flag

bits (1) V, // oVerflow condition flag

bits (1) D, // Debug mask bit [AArch64 only]

bits (1) A, // Asynchronous abort mask bit

bits (1) I, // IRQ mask bit

bits (1) F, // FIQ mask bit

bits (1) SS, // Software step bit

bits (1) IL, // Illegal execution state bit

bits (2) EL, // Exception Level (see above)

bits (1) nRW, // not Register Width: 0=64, 1=32

bits (1) SP, // Stack pointer select: 0=SP0, 1=SPx [AArch64 only]

bits (1) Q, // Cumulative saturation flag [AArch32 only]

bits (4) GE, // Greater than or Equal flags [AArch32 only]

bits (8) IT, // If-then execution state bits [AArch32 only]

bits (1) J, // J execution state bit [AArch32 only, RES0 in ARMv8]

bits (1) T, // T32 execution state bit [AArch32 only]

bits (1) E, // Endian execution state bit [AArch32 only]

bits (5) M // Mode field (see above) [AArch32 only]

)


PSTATE.{N, Z, C, V}: 条件标志位,这些位的含义跟之前AArch32位一样,分别表示补码标志,运算结果为0标志,进位标志,带符号位溢出标志,具体请参考:ARM(V8) Architecture Reference Manual.pdf page B1-62;


PSTATE.SS:异常发生的时候,通过设置MDSCR_EL1.SS 为 1启动单步调试机制;


PSTATE.IL:异常执行状态标志,非法异常产生的时候,会设置这个标志位,会导致的事件请参考:D1.11.3page D1-1439;


PSTATE.{D, A, I, F}:D表示debug异常产生,比如软件断点指令/断点/观察点/向量捕获/软件单步 等;A, I, F表示异步异常标志,异步异常会有两种类型:一种是物理中断产生的,包括SError(系统错误类型,包括外部数据终止),IRQ或者FIQ;另一种是虚拟中断产生的,这种中断发生在运行在EL2管理者enable的情况下:vSError,vIRQ,vFIQ;


PSTATE.nRW:表示当前ELx 所运行的状态,分为AArch64和AArch32:


SPSR_EL1.M[4] 决定EL0的执行状态,为0(64bit ),1(32bit);

HCR_EL2.RW 决定EL1的执行状态,为1(64bit ),0(32bit);

SCR_EL3.RW确定EL2 or EL1的执行状态,为1(64bit ),0(32bit);

PSTATE.SP: 某个ELx 下的堆栈指针,EL0下就表示sp_el0;


SPSR registers:


SPSR状态寄存器:之前也有说过当运行在EL0层的时候,所用的是sp_el0,当在更高级ELx运行的时候同时可以使用spsr_el0或者spsr_elx,所以这里用t,h后缀来区分,SPSR_ELx保存了进入ELx的PSTATE状态信息:

这里写图片描述

这里写图片描述

(三)A64指令集



(0)A64特点


移除了批量加载寄存器指令 LDM/STM, PUSH/POP, 使用STP/LDP 一对加载寄存器指令代替;

没有提供访问CPSR的单一寄存器,但是提供访问PSTATE的状态域寄存器;

A64没有协处理器的概念,没有协处理器指令MCR,MRC;

相比A32少了很多条件执行指令,只有条件跳转和少数数据处理这类指令才有条件执行.附件为条件指令码;

指令基本格式:


{}  , {,}

1

Opcode:操作码,也就是助记符,说明指令需要执行的操作类型

Cond:指令执行条件码,查看附件图;

S:条件码设置项,决定本次指令执行是否影响PSTATE寄存器响应状态位值

Rd/Xt:目标寄存器,A32指令可以选择R0-R14,T32指令大部分只能选择RO-R7,A64指令可以选择X0-X30;

Rn/Xn:第一个操作数的寄存器,和Rd一样,不同指令有不同要求;

Opcode2:第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit);


各种指令详细说明请查看ARM(V8) Architecture Reference Manual.pdf page C6-387 这里只是贴出了内存访问操作的指令;


内存操作指令load/store


所支持的寻址方式:

这里写图片描述

Base register only (no offset) :基址寄存器无偏移;

Base plus offset:基址寄存器加偏移;

Pre-indexed:事先更新寻址,先变化后操作,[base, #imm]!,!表示则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变;

Post-indexed:事后更新寻址,先操作后变化,[base], #imm;

Literal (PC-relative): PC相对寻址;

load/store指令分类(C3.2-131):批量寄存器、单个寄存器、一对寄存器、非-暂存、非特权、独占}以及load-Acquire、store-Release指令;


(1)单个寄存器load/store:

这里写图片描述

以LDR为例,下面为三种取址方式:

这里写图片描述

如:LDR X1,[X2]; 取出X2寄存器存储的地址中的内容复制到X1;

这里写图片描述

如:LDR X1,[X2],#4; 取出X2寄存器存储的地址中的内容复制到X1,然后X2 = X2 + 4;

这里写图片描述

如:LDR X1,[PC,#4];


(2)unscaled offset load/store:


Scaled 和Unscaled其实就是可以见到理解为对齐和非对齐,本质就是是否乘以一个常量,因为scaled的总是可以乘以一个常量来达到对齐,而Unscaled就不需要,是多少就多少,更符合人类自然的理解,寻址方式只支持:基址 + 9bit 的立即数偏移值范围为(-256 ~ 255)因为是带有符号的;

这里写图片描述

以LDUR为例:

这里写图片描述

(3)Load/Store Pair:


从Memory地址addr处读取两个双字/字数据到目标寄存器Xt1,Xt2;寻址方式:对齐的,有符号#simm7偏移,支持pre-/post-index 操作;

这里写图片描述

以LDP为例:

这里写图片描述

(4)Load/Store Non-temporal Pair:


所谓Non-temporal就是就是用于你确定知道该地址只加载一次,不需要触发缓存,避免数据被刷新,优化性能,其它指令都默认会写Cache;寻址方式:对齐的,有符号#simm7偏移,不支持pre-/post-index 操作;

这里写图片描述

以LDNP为例:

这里写图片描述

(4)Load/Store Unprivileged:


所谓Unprivileged就是说EL0/EL1的内存有不同的权限控制,这条指令以EL0的权限存取,用于模拟EL0的行为,该指令应用于EL1和EL0之间的交互;寻址方式: 非对齐的,有符号#simm9偏移,不支持pre-/post-index 操作;

这里写图片描述

以LDTR为例:


这里写图片描述

(4)Load-Exclusive/Store-Exclusive:


在多核CPU下,对一个地址的访问可能引起冲突,这个指令解决了冲突,保证原子性(所谓原子操作简单理解就是不能被中断的操作),是解决多个CPU访问同一内存地址导致冲突的一种机制。通常用于锁,比如spinlock,可以参考代码:


arch/arm64/include/asm/spinlock.h


寻址方式:无偏移基址寄存器,不支持pre-/post-index 操作;

这里写图片描述

以LDXR为例:

这里写图片描述

(4)Load-Acquire/Store-Release:


内存屏障操作,Load-Acquire读操作,相当于半个DMB指令,只管读内存操作;Store-Release写操作,相当于半个DMB指令,只管写内存操作;本质是为了解决乱序执行中有依赖关系的指令可以按正确的逻辑执行的一种机制,而DMB,DSB,ISB的强制性(权限)由低到高;寻址方式:无偏移基址寄存器,不支持pre-/post-index 操作;

这里写图片描述

以LDAR为例:

这里写图片描述

附件

这里写图片描述

条件指令码:


特殊符号定义:


特殊符号  对应伪操作   含义 

=        DCB       分配一片连续的字节存储单元并用指定的数据初始化

&        DCD       分配一片连续的字存储单元并用指定的数据初始化

%        SPACE     分配一片连续的存储单元

^        MAP       定义一个结构化内存表的首地址

#        FILED     定义一个结构化内存表的数据域(经常和MAP一起使用,一个定义起始地址,一个定义长度)

*        EQU       为程序中的常量、标号等定义一个等效的字符名

!                  地址更新

[                  相当于IF

|                  相当于ELSE

]                  相当于ENDIF


推荐阅读

史海拾趣

乐鑫(espressif)公司的发展小趣事

面对物联网行业的快速发展和变化,乐鑫科技始终保持前瞻性的战略眼光。公司积极布局未来市场,加大在人工智能、云计算等领域的研发投入,以满足客户对更智能化、更高效的物联网应用的需求。同时,乐鑫科技还注重培养和引进优秀人才,为公司未来的发展提供有力的人才保障。

请注意,以上内容仅为概述性质的故事框架,具体细节和数据可能需要根据实际情况进行调整和补充。

Euroquartz公司的发展小趣事

Euroquartz在技术创新方面始终保持领先地位。公司推出的新款超薄MEMS滤波器系列产品,就是其技术实力的最好体现。这些滤波器在制造过程中,对互调失真及相位和振幅匹配等特性进行了优化,提供了从音频到3GHz的宽泛可选频率范围,最大功率可达200W。这些创新产品不仅满足了市场的需求,也进一步巩固了Euroquartz在电子元器件行业的领先地位。

Cooper Industries公司的发展小趣事

随着市场需求的不断变化,Cooper Industries不断通过收购来扩大其业务范围和提升技术实力。例如,在2008年,公司宣布收购了三家公司:Sure Power Industries、OMNEX Control Systems和Roam Secure。这三家公司在各自的领域都有着丰富的经验和卓越的技术,收购后极大地增强了Cooper在电力系统管理、无线电远程控制以及文字报警、区域警示系统等领域的能力。这些收购不仅使公司的产品线更加丰富,也为其在全球市场的竞争提供了有力武器。

AMD(超微)公司的发展小趣事

在照明领域,Cooper Industries同样展现出了强大的实力。1987年,公司收购了英国McGraw-Edison,并成立了“库柏照明”事业部,这一举措使库柏照明迅速成为世界上最大的商业、工业、道路和住宅照明装置的制造商之一。此后,公司不断在照明领域进行创新和突破,如在2007年成功收购以LED灯具著称的io Lighting灯具公司,进一步巩固了其在节能灯具市场的地位。这些努力使得库柏照明在全球范围内享有极高的声誉和市场份额。

Dexter Research Center Inc公司的发展小趣事

Dexter始终将技术创新作为企业发展的核心动力。公司不断投入研发资源,推动传感器技术的创新和发展。通过与高校、研究机构的合作,Dexter成功引入了多项新技术、新材料,并将其应用于产品中。这些创新产品不仅提高了传感器的性能和精度,还拓展了其应用领域。Dexter的创新精神引领了行业的发展方向,使其成为了行业的佼佼者。

AAC [American Accurate Components]公司的发展小趣事

AAC公司的创立可以追溯到上世纪90年代初,当时电子音响器件市场正迎来快速发展的机遇。AAC公司敏锐地捕捉到了这一市场趋势,迅速行动,与德国投资者共同成立了中德合资常州威利来电子音响器件有限公司。这一合资举措为AAC带来了先进的生产技术和管理经验,使其生产的讯响器和微型扬声器迅速打开了德国市场的大门。这一成功的合资经验为AAC后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

基于DSP和FPGA的信号采集的设计与实现

基于DSP和FPGA的信号采集的设计框图和实现代码…

查看全部问答>

太阳能给锂电池充电,出现爆裂,不知怎么回事

锂电池加了充电保护,电池12.60v,太阳能板标准16v,5w(实际肯定达不到)…

查看全部问答>

免费实验室申请

前段时间看到东方集成提供这个服务,提供免费实验室,详细http://www.jicheng.net.cn/rental/cart/lab_apply.html 分享给大家,有实际用过的希望给讲讲内幕…

查看全部问答>

串口通信中遇到的问题

CPU是STM32F103CB,无操作系统。 通过UART1接受GPRS发来的数据,在中断函数中 USART1_IRQHandler 中进行处理 unsigned char a_GPRSData[500]; unsigned int  g_DataLength; void USART1_IRQHandler(void)        ...…

查看全部问答>

MPLAB编译问题

Clean: Deleting intermediary and output files. Clean: Deleted file \"C:\\Program Files\\Microchip\\lzz1\\lzz001.cce\". Clean: Done. Executing: \"C:\\HT-PIC\\BIN\\PICC.EXE\" -C -E\"lzz001.cce\" \"lzz001.c\" -O\"lzz001.obj\" -Q - ...…

查看全部问答>

有一个病毒高手帮我做掉它!

是一个U盘感染的病毒,在D盘中出现一个autorun.inf文件,同时点D盘右健会多一个\"浏览\"项,而这个文件的内容是: [autorun] open=.\\recycled\\info.exe shell\\1=浏览 shell\\1\\Command=.\\recycled\\info.exe shellexecute=.\\recycled\\info. ...…

查看全部问答>

DS18b20温度显示问题

#include sbit ds=P3^7; //0-F数码管显示(共阴) unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-9数码管的显示,共阴带小数点 unsigned char code tabledot[]={ ...…

查看全部问答>

关于nios烧写问题、求大神帮助

使用的是ep2s180f1020i4的片子,配置芯片epcs64,用flash programmer 进行烧写,从状态栏来看 烧写成功了,但是上电后没有任何反应,不止nios没跑起来,连逻辑都没烧进去,但是在线运行时是正常的,单独烧写逻辑从新上电也是可以起来的,就是用nios ...…

查看全部问答>

第一版开关电源(新手入门,大神勿喷!)

经过再三调试,我人生的第一版开关电源诞生了,激动ing,不过也仍有很多问题没有解决!希望高手指教!这里好像不能传附件啊,详细过程在下面链接里面了,有兴趣的亲可以看看,多多指教!…

查看全部问答>