【方辉专栏】ARM64体系结构编程与实践学习笔记(四) A64指令集介绍及编码格式

0 评论

1. A64指令集介绍

指令集是处理器体系结构设计的重点之一。每种新型的架构在设计时就规定了一系列与其硬件电路相配合的指令系统。指令集的先进与否,关系到MCU性能发挥。指令集的完善也是提高微处理器效率的最有效的工具。

 

ARM指令集一直在变化和发展中。Armv8体系结构更大的改变是增加了一个新的64位指令集,这是对原来指令集的有益补充和增强。A64指令集可以处理64位宽的寄存器和数据,并使用64位的指针来访问内存。

 

Armv8架构在AArch64运行状态下使用A64指令集,在AArch32运行状态下使用A32指令集。A64指令集和A32 指令集是不兼容的,它们是两套完全不一样的指令集,它们的指令编码是不一样的。

 

注意:A64指令集的指令宽度是32位,而不是64位;只能运行在AArch64状态下。

 

A64汇编指令需要注意以下4点:

A64支持指令助记符和寄存器名称全是大写或全是小写字母。

使用立即数操作时,立即数前面可以加“#”,也可以不加。

“//”用于注释汇编代码。

通用寄存器前面的“W”表示寄存器低32位,“X”表示64位通用寄存器。

 

A64指令集分类:

内存加载和存储指令

多字节内存加载和存储指令

算术和移位指令

移位操作指令

位操作指令

条件操作指令

跳转指令

独占访问指令

内存屏蔽指令

异常处理指令

 

2. A64指令编码格式

A64指令集中每条指令的宽度为32位,其中第25-28位用来识别指令的分类,如下图所示:

A64指令集支持64位宽的数据和地址寻址,为什么指令的编码宽度只有32位?

因为A64指令集基于寄存器加载和存储的体系结构设计,所有的数据加载、存储以及处理都是在通用寄存器中完成的。

ARM64一共有31个通用寄存器,即X0-X30,因此在指令编码中使用5位宽度,这样可以索引32个通用寄存器。

 

例如立即数加载指令格式:LDR <Xt> , [ <Xn|SP> ], # <simm>

第0-4位为Rt字段,用来描述目标寄存器Xt,可以从X0-X30中选择。

第5-9位为Rn字段,用来描述基地址寄存器Xn,可以从X0-X30中选择。也可以选择SP寄存器为第31个寄存器。

第12-20位为imm9字段,用于偏移量simm.

第21-29位用于指令分类。

第30-31位为size字段,当为“11”时表示64位数据宽度,当为“10”时表示32位。

 

相关软件
使用 DS-5,可以轻松地为基于 arm 处理器的平台开发 Linux 应用程序。它降低了学习难度,缩短了开发和测试周期,帮助您快速生成可靠的应用程序。 经济实惠的专业解决方案,适用于以 C/C++ 开发 Linux 和 Android 应
相关阅读