ARM指令系统概述

摘译自Matteo Franchin的PPT《ARMv8-A A64 ISA Overview》。

寄存器

ARM共有31个通用寄存器和2个特殊寄存器,都是64位。31个通用寄存器用X0到X30来表示,两个特殊寄存器是SP和ZR。
SP是栈指针,其内容是栈底的地址,必须满足16字节对齐的条件,否则无法使用。例如:
ADD SP, SP, #8
这种用法是错误的,因为所得到的SP不满足16字节对齐的条件,造成之后的SP不可用。
ZR是0寄存器。当用作源寄存器的时候,其值恒为0,当用作目的寄存器的时候,值被抛弃,不能保存任何值。
向量和浮点寄存器。32个寄存器,向量和浮点共用,每个128位,用V0到V31来表示。不同的记号可以表示不同的长度,B表示字节,H表示半字,S表示单字,D表示双字,Q表示四字,如图1所示。


图1 不同长度数值的描述方式

系统寄存器。系统寄存器定义了处理器的上下文,通常带有后缀_ELx,表示能访问该寄存器的最低异常级别。分别对应有读(MRS)和写(MSR)系统寄存器的指令。
MRS X0, SCTLR_EL1
MSR SCTLR_EL1, X0

Load/Store指令

指令的使用

LDR和STR分别从地址中读入内容到寄存器和向地址中写入寄存器的内容。默认情况下,内容的大小由寄存器的名字决定,也可以使用后缀来指定读写较小的内容。后缀B表示字节,H表示半字,W表示单字。当写入较小的内容时,默认情况下,会对内容进行0扩展,也可以使用S来进行符号位扩展。图2中,第一条指令是把内容为8A的一个字节装入X4(64位)中,并进行符号位的扩展。第二条指令是把内容为8A的一个字节装入W4(32位)中,并进行0扩展。


图2 load指令示例

指定Load/Store指令的地址

按照从简单到复杂的分类方法,可以通过以下方式来指定访存指令的地址:从寄存器中获取地址;通过寄存器内容再加上偏移来获取地址;对偏移进行扩展、移位等运算之后,再与寄存器内容相加,获得地址。
LDR X0, [X1]                                ; 直接从寄存器X1的内容中获取地址。
LDR X0, [X1, #-8]                        ; X1的内容加上-8的偏移,得到地址。
LDR X0, [X1, X2]                         ; X!的内容和X2的内容相加得到地址。
LDR X0, [X1, W2, SXTW]          ; 对W2的内容做符号扩展,再与X1的内容相加,作为地址。
LDR X0, [X1, X2, LSL #2]          ; 把X2的内容左移2位,再与X1的内容相加,作为地址。

寻址模式

简单模式:X1的内容不会被改变,例如。
LDR X0, [X1]
LDR X0, [X1, #4]

前变址模式,X1的内容在load之前变化,例如。
LDR X0, [X1, #4]!  
等价于  
ADD X1, X1, #4
LDR X0, [X1]

后变址模式,X1的内容在load之后变化,例如。
LDR X0, [X1], #4
等价于
LDR X0, [X1]
ADD X1, X1, #4

浮点的Load/Store

浮点寄存器的Load/Store操作,通过寄存器的名称来指定写入寄存器内容的大小。B、H、S、D和Q分别代表字节、半字、单字、双字和四字。指令中不再有大小和符号扩展之类的内容,例如。
LDR  D1, [X0]           ; 从地址[X0]中取64位数值到D1寄存器中。
STR  Q0, [X0, X1]    ; 存128位的内容到地址[X0 + X1]。

Load/Store一个寄存器对

支持对整型、浮点标量和向量,要求源寄存器和目的寄存器必须具有相同的宽度,例如。
LDP W3, W7, [X0]        ; [X0] => W3, [X0 + 4 bytes] =>W7
STP Q0, Q1, [X4]        ; Q0 => [X4], Q1=>[X4 + 16 bytes]

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值