「Arm Arch」 ISA 概述

简介: 「Arm Arch」 ISA 概述

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

一、定义

ISA是计算机硬件与系统软件之间的接口,指机器语言程序员或操作系统、编译器、解释器设计人员所看到的计算机功能特性和概念性结构,ISA 是计算机体系结构中非常重要的部分,通常是一套规范。


二、要素

ISA 规定了数据类型、寄存器、字节次序、指令格式、指令集、寻址方式、异常处理方式。


2.1 数据类型

字节、半字、字、双字等


2.2 寄存器

寄存器(Register),是中央处理器内的其中组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器和程序计数器。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器。


2.3 字节次序

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。


2.4 指令格式

一条机器指令是一组有意义的二进制代码,是一串高低电平信号,用来指挥计算机运作,表示计算机中的一条命令。


一条指令包含操作码和地址码两部分。操作码表示指令的操作和功能,用来告诉计算机来做什么操作,地址码表示操作数的地址或者操作数本身,用来告诉计算机操作的对象,以及这些对象的地址等信息。


一条机器指令的长度与机器字长没有固定关系。机器指令的长度可以等于机器字长,称为单字长指令;也可以等于半个机器字长,称为半字长指令;还可以等于两个机器字长,称为双字长指令。


定长指令字结构:一个指令系统中的所有指令长度均相等,简单但不灵活。

变长指令字结构:指令系统中指令的长短各异,灵活但复杂。

2.5 指令集

指令集是指操作计算机的指令系统,指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。


2.6 寻址方式

寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。


2.6.1 指令寻址

顺序寻址方式

由于指令地址在内存中按顺序安排,当执行一段程序时,通常是一条指令接一条指令地顺序进行。也就是说,从存储器取出第1条指令,然后执行这条指令;接着从存储器取出第2条指令,再执行第二条指令;接着再取出第3条指令。


这种程序顺序执行的过程,称为指令的顺序寻址方式。为此,必须使用程序计数器(又称指令计数器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。


跳跃寻址方式

当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。注意,程序跳跃后,按新的指令地址开始顺序执行。因此,程序计数器的内容也必须相应改变,以便及时跟踪新的指令地址。


采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。


注意是否跳跃可能受到状态寄存器的操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC程序计数器的值,所以下一条指令仍是通过程序计数器PC给出。


2.6.2 数据寻址

形成操作数的有效地址的方法称为操作数的寻址方式。


由于大型机、小型机、微型机和单片机结构不同,从而形成了各种不同的操作数寻址方式。下面介绍一些比较典型又常用的操作数寻址方式。


隐含寻址

这种类型的指令,不是明显地给出操作数的地址。而是在指令中隐含着操作数的地址。例如,单地址的指令格式,就不明显地在地址字段中指出第2操作数的地址,而是规定累加寄存器AC作为第2操作数地址,指令格式明显指出的仅是第1操作数的地址D。



立即寻址

指令的地址字段指出的不是操作数的地址,而是操作数本身,这种寻址方式称为立即寻址。立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。



直接寻址

直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址的字段中直接指出操作数在内存的地址。


由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为直接寻址方式。在指令中直接给出参与运算的操作数及运算结果所存放的主存地址,即在指令中直接给出有效地址 。



间接寻址

间接寻址是相对直接寻址而言的,在间接寻址的情况下,指令地址字段中的形式地址不是操作数的真正地址,而是操作数地址的指示器,或者说此形式地址单元的内容才是操作数的有效地址。



寄存器直接、间接寻址方式

当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。显然,此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。指令结构中的RR型指令,就是采用寄存器寻址方式的例子。


寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。



相对寻址方式

相对寻址是把程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言。采用相对寻址方式的好处是程序员无须用指令的绝对地址编程,因而所编程序可以放在内存的任何地方。



基址寻址方式

在基址寻址方式中将CPU中的基址寄存器的内容,加上变址寄存器的内容而形成操作数的有效地址。基址寻址的优点是可以扩大寻址能力,因为与相对地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。



变址寻址方式

变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个变址寄存器的内容与偏移量D相加来形成操作数有效地址。


但使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律变化。为此,必须使变址寄存器的内容实现有规律的变化(如自增1、自减1、乘比例系数)而不改变指令本身,从而使有效地址按变址寄存器的内容实现有规律的变化。



块寻址方式

块寻址方式经常用在输入输出指令中,以实现外存储器或外围设备同内存之间的数据块传送。块寻址方式在内存中还可用于数据块移动。


2.7 异常处理方式

部分内容是以 Arm 架构为例


2.7.1  定义

有人说,正常工作之外的流程都叫异常,除了系统模式和用户模式外,其他情况都是异常;


以 Arm 指令集架构来看,这样说确实是合理的。


异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作;

中断是异常的一种;

2.7.2 分类

快速中断异常 FIQ

中断请求异常 IRQ

终止 Abort

指令预取终止、数据终止

软件中断指令 SWI

未定义指令异常

2.7.3 异常向量表

异常向量表是硬件向软件提供的处理异常的入口,是软件处理异常的接口;

当异常发生时,CPU 会产生一些自动动作,比如PC 跳转到异常向量处处理异常,有时伴有一些辅助动作;

2.7.4 异常处理流程

当⼀种异常发⽣时,硬件就会⾃动执⾏如下动作:

将CPSR保存到相应异常模式下的SPSR中

把PC寄存器保存到相应异常模式下的LR中

将CPSR设置成相应的异常模式

设置PC寄存器的值为相应处理程序的⼊⼝地址

当异常结束时,异常处理程序必须:

将LR中的值减去偏移量后存⼊PC,偏移量根据异常的类型⽽有所不同;

将SPSR的值复制回CPSR;

清零中断禁⽌标志,恢复CPSR的动作会将T、F和I位⾃动恢复为异常发⽣前的值

R15(PC)总是指向“正在取指”的指令,⽽不是指向“正在执⾏”的指令或正在“译码”的指令。⼀般来说,⼈们习惯性约定将“正在执⾏的 指令作为参考点”,称之为当前第⼀条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节 的地址,即:PC值=当前程序执⾏位置+8;


三、Arm A-Profile 指令集架构

在了解了指令集架构概念后,我们可以根据学到的知识试着解读10000+ 页 的 Arm A-Profile 架构参考手册。


DDI0487 I.a a-profile architecture reference manual.pdf 【2022.8.18版本】


三、总结

本文首先介绍了指令集架构的定义、概念,然后对其关键要素进行了简要介绍,最后从指令集架构角度来拆解上万页的 Arm A-Profile 架构参考手册。


参考

【DDI0487 I.a】Arm Architecture Reference Manual for A-profile architecture

术语

图灵机


一个抽象的机器、思想模型;


总线


计算机各种功能部件之间传送信息的公共通信干线;


Trustzone


通过隔离实现可信域的技术;


Hypervisor


虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。


写在后面

皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~

“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~

下一章  Arm 指令集架构「指令集」


相关文章
|
11月前
|
机器学习/深度学习 存储 监控
「Arm Arch」 初识 Arm(上)
「Arm Arch」 初识 Arm(上)
560 1
|
11月前
|
存储 传感器 安全
「Arm Arch」 初识 Arm(下)
「Arm Arch」 初识 Arm(下)
550 0
|
2月前
|
存储 缓存 安全
【ARM架构】ARMv8-A 系统中的安全架构概述
【ARM架构】ARMv8-A 系统中的安全架构概述
69 0
|
11月前
|
存储 编译器 内存技术
「Arm Arch」 ISA 寄存器
「Arm Arch」 ISA 寄存器
|
11月前
|
传感器 缓存 监控
「Arm Arch」 微架构
「Arm Arch」 微架构
163 0
|
11月前
|
存储 机器学习/深度学习 Java
「Arm Arch」 ISA 指令集
「Arm Arch」 ISA 指令集
213 0
|
11月前
|
传感器 缓存 虚拟化
「Arm Arch」 虚拟化微架构
「Arm Arch」 虚拟化微架构
104 0
|
11月前
|
存储 传感器 缓存
「Arm Arch」 调试微架构
「Arm Arch」 调试微架构
|
11月前
|
存储 传感器 缓存
「Arm Arch」 总线微架构
「Arm Arch」 总线微架构
100 0
|
11月前
|
存储 传感器 缓存
「Arm Arch」 安全微架构
「Arm Arch」 安全微架构
104 0