当前位置:   article > 正文

ARMv8架构与指令集_armv8 and指令

armv8 and指令

ARMv8架构与指令集

1. ARMv8寄存器体系

1.1 概述

​ ARMv8架构继承了ARMv7与之前处理器技术的基础,除了对现有的16/32bit的Thumb2指令支持外,也向前兼容了现有的A32(ARM 32bit)指令集,基于64bit的AArch64架构,除了新增A64(ARM 64bit)指令集外,也扩充了现有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集,另外还新增加了CRYPTO(加密)模块支持。

1.2 特性

  1. ARMv8提供了AArch32 state和AArch64 state两种Execution State
AArch 32AArch 64
提供13个32bit通用寄存器R0-R12,一个32bit PC指针 (R15)、堆栈指针SP (R13)、链接寄存器LR (R14)提供31个64bit通用寄存器X0-X30(W0-W30),其中X30是程序链接寄存器LR
提供一个32bit异常链接寄存器ELR,用于Hyp mode下的异常返回提供一个64bit PC指针、堆栈指针SPx 、异常链接寄存器ELRx
提供32个64bit SIMD向量和标量floating-point支持提供32个128bit SIMD向量和标量floating-point支持
提供两个指令集A32(32bit)、T32(16/32bit)定义ARMv8异常等级ELx(x<4),x越大等级越高,权限越大
兼容ARMv7的异常模型定义一组PSTATE,用以保存PE(Processing Element)状态
协处理器只支持CP10\CP11\CP14\CP15没有协处理器概念
  1. Exception Level

​ 2.1 ARMv8定义EL0-EL3共 4个Exception Level来控制PE的行为

Exception Level
ELx(x<4),x越大等级越高,执行特权越高
执行在EL0称为非特权执行
EL2 没有Secure state,只有Non-secure state
EL3 只有Secure state,实现EL0/EL1的Secure和Non-secure之间的切换
EL0 & EL1 必须要实现,EL2/EL3则是可选实现

​ 2.2 Exception Level & Security

Exception Level
EL0Application
EL1Linux kernel- OS
EL2Hypervisor
EL3Secure Monitor
Security
Non-secureNon-secure EL0/EL1/EL2, 只能访问Non-secure memory
SecureSecure EL0/EL1/EL3, 可以访问Non-secure memory & Secure memory

1.3 寄存器

​ 在ARM64架构下,CPU提供了33个寄存器, 其中前31个(0~30)是通用寄存器 (general-purpose integer registers),最后2个(31,32)是专用寄存器(sp寄存器和 pc 寄存器)。

寄存器说明
X0寄存器用来保存返回值(或传参)
X1 ~ X7 寄存器用来保存函数的传参
X8寄存器也可以用来保存返回值
X9 ~ X28寄存器一般寄存器,无特殊用途
x29(FP)寄存器用来保存栈底地址
X30 (LR)寄存器用来保存返回地址
X31(SP) 寄存器用来保存栈顶地址
X32(PC)寄存器用来保存当前执行的指令的地址

2. Armv8指令集

2.1 汇编指令

​ ARM指令使用的是 三地址码 , 它的格式如下:

<opcode> {<cond>} {S} <Rd> , <Rn> , <shifter_operand>

  • opcode:操作码,也就是助记符,操作码,也就是助记符,说明指令需要执行的操作类型

  • cond:指令执行条件码,在编码中占4bit,0b0000 -0b1110

  • S:条件码设置项,决定本次指令执行是否影响PSTATE寄存器响应状态位值

  • Rd:目标寄存器,A64指令可以选择X0-X30 or W0-W30

  • Rn:第一个操作数的寄存器,和Rd一样,不同指令有不同要求

  • shifter_operand:第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit)

2.2 指令分类

类型Note
跳转指令条件跳转、无条件跳转(#imm、register)指令
异常产生指令系统调用类指令(SVC、HVC、SMC)
系统寄存器指令读写系统寄存器,如 :MRS、MSR指令 可操作PSTATE的位段寄存器
数据处理指令包括各种算数运算、逻辑运算、位操作、移位(shift)指令
load/store内存访问指令load/store {批量寄存器、单个寄存器、一对寄存器、非-暂存、非特权、独占}以及load-Acquire、store-Release指令 (A64没有LDM/STM指令)
协处理器指令A64没有协处理器指令

2.3 寻址方式

类型立即数偏移寄存器偏移扩展寄存器偏移
基址寄存器(无偏移){ base{,#0 } }
基址寄存器(+ 偏移){ base{,#imm } }{ base,Xm{,LSL #imm } }[base,Wm,(S|U)XTW {#imm }]
Pre-indexed(事先更新)[ base,#imm ]!
Post-indexed(事后更新)[ base,#imm ]{ base },Xm
PC-相对寻址label

2.4 A64指令集

常用A64指令:

add

将某一寄存器的值和另一寄存器的值 相加 并将结果保存在另一寄存器中,如:

add x0, x0, #1    ; 将寄存器 x0 的值和常量 1 相加后保存在寄存器 x0 中
add x0, x1, x2    ; 将寄存器 x1 和 x2 的值相加后保存到寄存器 x0 中
add x0, x1, [x2]  ; 将寄存器 x1 的值加上寄存器 x2 的值作为地址,再取该内存地址的内容放入寄存器 x0 中
  • 1
  • 2
  • 3

mov

把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量,如:

mov R1, R0   		; 将寄存器R0的值传送到寄存器R1
mov PC, R14   		; 将寄存器R14的值传送到PC,常用于子程序返回
mov R1, R0, LSL#3	; 将寄存器R0的值左移3位后传送到R1(即乘8)
movs PC, R14		; 将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位
  • 1
  • 2
  • 3
  • 4

sub

sub指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算,如:

sub  R0, R1, R2           ;R0 = R1 - R2
sub  R0, R1, #256         ;R0 = R1 - 256
sub  R0, R2, R3, LSL#1    ;R0 = R2 - (R3 << 1)
  • 1
  • 2
  • 3

and

and指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1的某些位。如:

AND  R0, R0, #3           	;3(0011) 该指令保持R0的0、1位,其余位清零。
  • 1

stp

入栈指令(str 的变种指令,可以同时操作两个寄存器),如:

stp x29, x30, [sp, #0x10] 	; 将 x29, x30 的值存入 sp 偏移 16 个字节的位置
  • 1

ldp

出栈指令(ldr 的变种指令,可以同时操作两个寄存器),如:

ldp x29, x30, [sp, #0x10]    ; 将 sp 偏移 16 个字节的值取出来,存入寄存器 x29 和寄存器 x30
  • 1

blr

跳转到 某寄存器 (的值)指向的地址(有返回),先将下一指令地址(即函数返回地址)保存到寄存器 lr (x30)中,再进行跳转,如:

blr x20       ; 先将下一指令地址(x20 指向的函数调用后的返回地址)保存到寄存器 lr 中,然后再调用 x20 指向的函数
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/944955
推荐阅读
相关标签
  

闽ICP备14008679号