ARMV8的64位指令
一、介绍
ARMv8 体系结构最大的改变是增加了一个新的 64 位的指令集,这是早前 ARM 指令集
的有益补充和增强。它可以处理 64 位宽的寄存器和数据并且使用 64 位的指针来访问内存。这
个新的指令集称为 A64 指令集,运行在 AArch64 状态。 ARMv8 兼容旧的 32 位指令集——A32
指令集,它运行在 AArch32 状态。注意:A64 指令集的指令宽度是 32 位,而不是 64 位。
二、分类
A64 指令集可以分成如下几类:
- 内存加载和存储指令;
- 多字节内存加载和存储指令;
- 算术和移位指令;
- 移位操作指令;
- 位操作指令;
- 条件操作指令;
- 跳转指令;
- 独占访存指令;
- 内存屏障指令;
- 异常处理指令
A64 指令汇编需要注意的地方如下:
A64 支持指令助记符和寄存器名全是大写字母或者全是小写字母的书写方式。不过,程序和数据标签是区分大小写的。
在使用立即操作数时前面可以使用“#”或者不使用“#”。
通用寄存器前面使用“w”表示仅使用通用寄存器的低 32 位,“x”表示 64 位通用寄存器。
三、A64 指令编码格式
A64 指令集中每条指令的宽度为 32 位, 其中第 24~28 位用来识别指令的分类, 如图 3.1 所示。
表中, x 表示该位可以是 1 或者 0。以加载与存储指令为例,第 25 位必须为 0,第 27 位为
1,其他 3 位可以是 0 或者 1。
当根据 op0 字段确定了指令的分类之后,还需要进一步确定指令的细分类别。以加载与存
储指令为例,加载与存储指令的格式如图 3.2 所示。
如图 3.2 所示,加载与存储指令格式可以细分为 op0、 op1、 op2、 op3 以及 op4 这几个字段。
这些字段不同的编码又可以对加载与存储指令继续细分,如表 3.2 所示
为什么指令的编码宽度只有 32 位?
因为 A64 指令集基于寄存器加载和存储的体系结构设计,编码宽度32位足够了。使用op1+op2字段,一共五位。在指令编码中使用 该5 位宽,这样一共可以索引 32(25 = 32)个通用寄存器。ARM64 一共有 31 个通用寄存器,即 X0~X30,另外,在下面的条件下,我们还可以描述第 31 个寄存器。
- 当使用寄存器作为基地址时,把 SP(栈指针)寄存器当作第 31 个通用寄存器。
- 当用作源寄存器操作数时,把 XZR 当作第 31 个通用寄存器
四、具体的指令
MOV:数据传送指令,将一个寄存器的值复制到另一个寄存器。
MOV R0, R1 ; 将R1的值复制到R0
LDR:从内存加载数据到寄存器
LDR R0, [R1] ; 将R1指向的内存地址中的值加载到R0
算术运算指令
ADD:加法指令,将两个寄存器的值相加,结果存入第三个寄存器。
ADD R0, R1, R2 ; R0 = R1 + R2
SUB:减法指令,从一个寄存器中减去另一个寄存器的值,结果存入第三个寄存器。
SUB R0, R1, R2 ; R0 = R1 - R2
BIC: 指定位清零指令
BIC{S}<c> <Rd>, <Rn>, #<const>;将rn中的字数据const为1的比特清零,把结果放入rd
orr: 指定位置位指令:
ORR{S}<c> <Rd>, <Rn>, #<const>
S后缀
汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位
N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0
Z:如果结果为0,则Z=1;如果结果为非零,否则Z=0
C:是针对无符号数最高有效位向更高位进位时C=1;减法中运算结果的最高有效位从更高位借位时C=0
V:该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;两个最高有效位均为1的数相加,得到的结果最高有效位为0;除了这两种情况以外V位为0
参考:
参考:
ARM汇编指令_arm指令-CSDN博客
ARM指令集详解-CSDN博客
汇编指令入门级整理-CSDN博客
ARM全汇编指令(详细)整理附实例快速掌握_arm指令集-CSDN博客