「Arm Arch」 ISA 寄存器

简介: 「Arm Arch」 ISA 寄存器

本文源自《书香度年华》「ARM 架构专栏」,是一系列由浅入深、循序渐进的文章,文章之间有一定的前后关联性,所以按顺序阅读,建议收藏专栏。

目录


一. 定义


寄存器在计算机中是用来寄存数据的,因为是寄存,所以其存放的数据变化是非常频繁的。通常来讲,从数据生命周期长短来看,寄存器<SRAM<DRAM<非易失存储器(闪存/磁盘)。正因为其高频使用,寄存器在ARM架构中重要性不言而喻。

二、通用寄存器


顾名思义,用来实现计算模型的通用寄存器。
X0~X30共31个64位寄存器,W0~W30对应Xn寄存器低32位,可以认为是兼容32位用法;

X29为Frame Pointer,存放当前栈帧;X30为Link Rigister,记录程序返回地址。

、特殊寄存器


用来使完善、优化、辅助计算模型的寄存器;
Zero寄存器

用来存放0,相比立即数#0,可以减少指令数,提高效率;XZR/WZR分别是64位和32位,在指令编码中,被编码成31,故没有X31寄存器。向Zero寄存器写入数据,相当于丢弃数据。


程序计数器PC

记录当前程序运行的指令地址,在ARMv8后,不允许显示的将PC作为目标寄存器,即不允许mov PC, xx这种用法,能够让计算流更加确定,易追踪。


堆栈指针SP

栈指针主要用来存放局部数据存放的地址,因为寄存器数量有限,而参与计算的临时或者局部数据可能会很多,所以需要内存来存放这些数据,这块内存称之为栈,就像客栈那样是临时寄宿的一样。

ARMv8后要求16字节对齐,每个执行级别都有自己的SP寄存器,EL0只能访问SP_EL0,而其它执行级别可以访问所有级别的SP;SP_EL0也可以通过PSTATE.SP访问。


程序状态寄存器CPSR/SPSR

计算模型在计算过程中会产生很多状态,比如有没有进位、有没有溢出,还会包含当前程序运行的其他状态,这些状态保存在当前程序状态寄存器 CPSR中,因为各个异常级别公共一个CPSR,所以每个异常级别都有用于保存自己CPSR的寄存器 SPSR。在异常级别切换时(无论是手动的还是自动的),CPSR都会保存进SPSR,等下一次返回时,再从SPSR恢复到CPSR中。


异常返回地址寄存器ELR

四、系统寄存器


用来对计算模型进行配置并记录其状态的寄存器;
系统配置寄存器SCR,TBD


系统控制寄存器SCTLR,TBD


转换表基址寄存器TTBR,TBD

异常向量基址寄存器VBAR,TBD

附录

寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。 [1]


按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。 [1]


基本含义

寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。 [2]


在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。 [2]


Cortex-M4总共有18个寄存器,相比传统ARM(如ARM7/ARM9/Cortex-A系列)的38个寄存器已减少很多,减少了内核核心面积(Die-size)。 [2]

寄存器


对于编译器非常友好易用,例如:包含灵活的寄存器配置,任意寄存器之间可实现单周期乘法,任意寄存器可以作为数据、结构或数组的指针。此外,Cortex-M4还包含4个特殊功能寄存器PRIMASK、FAUI。TMASK、BASEPRI和CONTROL。 [2]


基本概念

寄存器最起码具备以下4种功能。


①清除数码:将寄存器里的原有数码清除。 [3]


②接收数码:在接收脉冲作用下,将外输入数码存入寄存器中。 [3]


③存储数码:在没有新的写入脉冲来之前,寄存器能保存原有数码不变。 [3]


④输出数码:在输出脉冲作用下,才通过电路输出数码。 [3]


仅具有以上功能的寄存器称为数码寄存器;有的寄存器还具有移位功能,称为移位寄存器。 [3]  





PORT1的控制寄存器(2张)


寄存器有串行和并行两种数码存取方式。将n位二进制数一次存入寄存器或从寄存器中读出的方式称为并行方式。将n位二进制数以每次1位,分成n次存入寄存器并从寄存器读出,这种方式称为串行方式。并行方式只需一个时钟脉冲就可以完成数据操作,工作速度快,但需要n根输入和输出数据线。串行方式要使用几个时钟脉冲完成输入或输出操作,工作速度慢,但只需要一根输入或输出数据线,传输线少,适用于远距离传输。


结构

编辑 播报


在数字电路中,用来存放二进制数据或代码的电路称为寄存器。寄存器是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,存放门位二进制代码的寄存器需用逐个触发器来构成。 [4]


对寄存器中的触发器只要求它们具有置1,置0的功能即可,因而无论是用电平触发的锁存器(latch-up),还是用脉冲触发或边沿触发的触发器(flip-flop),都可以组成寄存器。 [4]


由电平触发的动作特点可知,在CLK高电平期间,Q端的状态跟随D端状态的改变而改变;CLK变成低电平以后,Q端将保持CLK变为低电平时刻D端的状态。 [4]


74HC175则是用CMOS边沿触发器组成的4位寄存器,根据边沿触发的动作特点可知,触发器输出端的状态仅仅取决于CLK上升沿到达时刻D端的状态。可见,虽然74LS75和74HC175都是4位寄存器,但由于采用了不同结构类型的触发器,所以动作特点是不同的。 [4]


为了增加使用的灵活性,在有些寄存器电路中还附加了一些控制电路,使寄存器又增添了异步置零、输出三态控制和保持等功能。这里所说的保持,是指CLK信号到达时触发器不随D端的输入信号而改变状态,保持原来的状态不变。 [4]


上面介绍的两个寄存器电路中,接收数据时所有各位代码都是同时输入的,而且触发器中的数据是并行地出现在输出端的,因此将这种输入、输出方式称为并行输入、并行输出方式。 [4]  

工作原理

在计算机及其他计算系统中,寄存器是一种非常重要的、必不可少的数字电路苛件,它通常由触发器(D触发器)组成,主要作用是用来暂时存放数码或指令。一个触发器可以存放一位二进制代码,若要存放N位二进制数码,则需用N个触发器。 [6]


寄存器应具有接收数据、存放数据和输出数据的功能,它由触发器和门电路组成。只有得到“存入脉冲”(又称“存入指令”、“写入指令”)时,寄存器才能接收数据;在得到“读出”指令时,寄存器才将数据输出。 [6]


寄存器存放数码的方式有并行和串行两种。并行方式是数码从各对应位输入端同时输入到寄存器中;串行方式是数码从一个输入端逐位输入到寄存器中。 [6]


寄存器读出数码的方式也有并行和串行两种。在并行方式中,被读出的数码同时出现在各位的输出端上;在串行方式中,被读出的数码在一个输出端逐位出现。 [6]  


寄存器(3张)



类型

1.通用寄存器组


通用寄存器组包括AX、BX、CX、DX4个16位寄存器,用以存放16位数据或地址。也可用作8位寄存器。用作8位寄存器时分别记为AH、AL、BH、BL、CH、CL、DH、DL。只能存放8位数据,不能存放地址。它们分别是AX、BX、CX、DX的高八位和低八位。若AX=1234H,则AH=12H,AL=34H。通用寄存器通用性强,对任何指令,它们具有相同的功能。为了缩短指令代码的长度,在8086中,某些通用寄存器用作专门用途。例如,串指令中必须用CX寄存器作为计数寄存器,存放串的长度,这样在串操作指令中不必给定CX的寄存器号,缩短了串操作指令代码的长度。下面一一介绍:


AX(AH、AL):累加器。有些指令约定以AX(或AL)为源或目的寄存器。输入/输出指令必须通过AX或AL实现,例如:端口地址为43H的内容读入CPU的指令为INAL,43H或INAX,43H。目的操作数只能是AL/AX,而不能是其他的寄存器。 [5]


BX(BH、BL):基址寄存器。BX可用作间接寻址的地址寄存器和基地址寄存器,BH、BL可用作8位通用数据寄存器。 [5]


CX(CH、CL):计数寄存器。CX在循环和串操作中充当计数器,指令执行后CX内容自动修改,因此称为计数寄存器。 [5]


DX(DH、DL):数据寄存器。除用作通用寄存器外,在I/O指令中可用作端口地址寄存器,乘除指令中用作辅助累加器。 [5]


2.指针和变址寄存器


BP( Base Pointer Register):基址指针寄存器。 [5]


SP( Stack Pointer Register):堆栈指针寄存器。 [5]


SI( Source Index Register):源变址寄存器。 [5]


DI( Destination Index Register):目的变址寄存器。 [5]


这组寄存器存放的内容是某一段内地址偏移量,用来形成操作数地址,主要在堆栈操作和变址运算中使用。BP和SP寄存器称为指针寄存器,与SS联用,为访问现行堆栈段提供方便。通常BP寄存器在间接寻址中使用,操作数在堆栈段中,由SS段寄存器与BP组合形成操作数地址即BP中存放现行堆栈段中一个数据区的“基址”的偏移量,所以称BP寄存器为基址指针。 [5]


SP寄存器在堆栈操作中使用,PUSH和POP指令是从SP寄存器得到现行堆栈段的段内地址偏移量,所以称SP寄存器为堆栈指针,SP始终指向栈顶。 [5]


寄存器SI和DI称为变址寄存器,通常与DS一起使用,为访问现行数据段提供段内地址偏移量。在串指令中,其中源操作数的偏移量存放在SⅠ中,目的操作数的偏移量存放在DI中,SI和DI的作用不能互换,否则传送地址相反。在串指令中,SI、DI均为隐含寻址,此时,SI和DS联用,Dl和ES联用。 [5]


3.段寄存器


8086/8088CPU可直接寻址1MB的存储器空间,直接寻址需要20位地址码,而所有内部寄存器都是16位的,只能直接寻址6KB,因此采用分段技术来解决。将1MB的存储空间分成若干逻辑段,每段最长64KB,这些逻辑段在整个存储空间中可浮动。 [5]


8086/8088CPU内部设置了4个16位段寄存器,它们分别是代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES、由它们给出相应逻辑段的首地址,称为“段基址”。段基址与段内偏移地址组合形成20位物理地址,段内偏移地址可以存放在寄存器中,也可以存放在存储器中。 [5]


例如:代码段寄存器CS存放当前代码段基地址,IP指令指针寄存器存放了下一条要执行指令的段内偏移地址,其中CS=2000H,IP=001AH。通过组合,形成20位存储单元的寻址地址为2001AH。 [5]


代码段内存放可执行的指令代码,数据段和附加段内存放操作的数据,通常操作数在现行数据段中,而在串指令中,目的操作数指明必须在现行附加段中。堆栈段开辟为程序执行中所要用的堆栈区,采用先进后出的方式访问它。各个段寄存器指明了一个规定的现行段,各段寄存器不可互换使用。程序较小时,代码段、数据段、堆栈段可放在一个段内,即包含在64KB之内,而当程序或数据量较大时,超过了64KB,那么可以定义多个代码段或数据段、堆栈段、附加段。现行段由段寄存器指明段地址,使用中可以修改段寄存器内容,指向其他段。有时为了明确起见,可在指令前加上段超越的前缀,以指定操作数所在段。 [5]


4.指令指针寄存器IP


8086/8088CPU中设置了一个16位指令指针寄存器IP,用来存放将要执行的下一条指令在现行代码段中的偏移地址。程序运行中,它由BIU自动修改,使IP始终指向下一条将要执行的指令的地址,因此它是用来控制指令序列的执行流程的,是一个重要的寄存器。8086程序不能直接访问IP,但可以通过某些指令修改IP的内容。例如,当遇到中断指令或调用子程序指令时,8086自动调整IP的内容,将IP中下一条将要执行的指令地址偏移量入栈保护,待中断程序执行完毕或子程序返回时,可将保护的内容从堆栈中弹出到IP,使主程序继续运行。在跳转指令时,则将新的跳转目标地址送入IP,改变它的内容,实现了程序的转移。 [5]


5.标志寄存器FR


标志寄存器FR也称程序状态字寄存器。 [5]  


寄存器(2张)

FR是16位寄存器,其中有9位有效位用来存放状态标志和控制标志。状态标志共6位,CF、PF、AF、ZF、SF和OF,用于寄存程序运行的状态信息,这些标志往往用作后续指令判断的依据。控制标志有3位,IF、DF和TF,用于控制CPU的操作,是人为设置的。 [5]

相关文章
|
10月前
|
机器学习/深度学习 存储 监控
「Arm Arch」 初识 Arm(上)
「Arm Arch」 初识 Arm(上)
556 1
|
10月前
|
存储 传感器 安全
「Arm Arch」 初识 Arm(下)
「Arm Arch」 初识 Arm(下)
546 0
|
10月前
|
传感器 缓存 监控
「Arm Arch」 微架构
「Arm Arch」 微架构
163 0
|
10月前
|
存储 机器学习/深度学习 Java
「Arm Arch」 ISA 指令集
「Arm Arch」 ISA 指令集
213 0
|
10月前
|
传感器 缓存 虚拟化
「Arm Arch」 虚拟化微架构
「Arm Arch」 虚拟化微架构
104 0
|
10月前
|
存储 传感器 缓存
「Arm Arch」 调试微架构
「Arm Arch」 调试微架构
|
10月前
|
存储 传感器 缓存
「Arm Arch」 总线微架构
「Arm Arch」 总线微架构
100 0
|
10月前
|
存储 传感器 缓存
「Arm Arch」 安全微架构
「Arm Arch」 安全微架构
104 0
|
10月前
|
存储 程序员 编译器
「Arm Arch」 ISA 概述
「Arm Arch」 ISA 概述
156 0
|
1月前
|
数据处理 编译器 数据库
x64 和 arm64 处理器架构的区别
x64 和 arm64 处理器架构的区别