★★★ 个人博客导读首页—点击此处 ★★★

文章目录

  • 1、一个简单的aarch64架构图
  • 2、A64指令集的特点:
  • 3、跳转指令
    • (1)、条件跳转指令
    • (2)、无条件跳转label指令
    • (3)、无条件跳转register指令
  • 4、异常产生和返回
    • (1)、异常产生指令
    • (2)、异常返回指令
    • (3)、debug的异常指令
  • 5、系统访问指令
    • (1)、系统寄存器访问指令
    • (2)、系统操作指令
  • 6、提示指令Hint instructions
  • 7、Barriers指令
  • 7、指针授权指令:Pointer authentication instructions
  • 8、存取指令 : Loads and stores
    • (1)、存取指令的寻址模式
    • (2)、load/store指令的介绍
      • a、Load-Store Pair
      • b、LDNP and STNP 非暂存指令
      • c、Load-Store Unprivileged
      • d、Load-Store Exclusive
      • e、Load-Acquire / Store-Release

1、一个简单的aarch64架构图

2、A64指令集的特点:

  • x0-x30 : 31个通用寄存器(general-purpose register),且都扩展到了64位, 其中x30是sp(Stack Pointer)
  • Zero Register: XZR/WZR,在大多数情况下,作为源寄存器使用时, 读出来的值 是0; 作为目标寄存器使用时, 丢弃结果。
  • 不再有LDM、STM、PUSH、POP指令, 取而代之的是STP、LDP
  • 条件指令大量的减少了
  • 不能将CPSR作为单个寄存器访问,确认代之的是PSTATE
  • 删除了"协处理器"概念,取而代之的是通过系统寄存器访问
    o System register access
    o Cache/TLB management
    o VAPA translation
    o Barriers and CLREX
    o Architectural hints (WFI, etc)
    o Debug

通用寄存器分类

PSTATE寄存器:

3、跳转指令

指令统计

  • 条件跳转指令 : 5个
  • 无条件跳转label指令 : 2个
  • 无条件跳转register指令 : 3个

(1)、条件跳转指令

(偏移范围为±1MiB)

  • b.cond label
  • cbz Xn|Wn, label
  • cbnz Xn|Wn, label
  • tbz Xn|Wn, #uimm6, label //如果Xn的第uimm的bit位位0,则跳转到label
  • tbnz Xn|Wn, #uimm6, label

(b.cond的condition条件)

(b.cond的应用)

        .align  7, INV_INSN
el0_sync_a64:restore_mappingmrs     x2, esr_el1mrs     x3, sp_el0lsr     x2, x2, #ESR_EC_SHIFTcmp     x2, #ESR_EC_AARCH64_SVCb.eq    el0_svc    //-----------b.cond的应用b       el0_sync_abortcheck_vector_size el0_sync_a64

(cbz、cbnz的应用)
当调用__cpu_spin_trylock(lock)时

FUNC __cpu_spin_trylock , :mov     x1, x0mov     w2, #SPINLOCK_LOCK
.loop:  ldaxr   w0, [x1]cbnz    w0, .cpu_spin_trylock_out  //------相当于是在检查参数的合法性,lock==NULL时直接返回stxr    w0, w2, [x1]cbnz    w0, .loop
.cpu_spin_trylock_out:ret
END_FUNC __cpu_spin_trylock

(tbz、tbnz的应用)

LOCAL_FUNC el1_sync_abort , :mov     x0, spmsr     spsel, #0mov     x3, sp          /* Save original sp *//** Update core local flags.* flags = (flags << THREAD_CLF_SAVED_SHIFT) | THREAD_CLF_ABORT;*/ldr     w1, [x0, #THREAD_CORE_LOCAL_FLAGS]lsl     w1, w1, #THREAD_CLF_SAVED_SHIFTorr     w1, w1, #THREAD_CLF_ABORTtbnz    w1, #(THREAD_CLF_SAVED_SHIFT + THREAD_CLF_ABORT_SHIFT), \  //--------------tbnz的使用.Lsel_tmp_sp/* Select abort stack */ldr     x2, [x0, #THREAD_CORE_LOCAL_ABT_STACK_VA_END]b       .Lset_sp
.Lsel_tmp_sp:/* Select tmp stack */ldr     x2, [x0, #THREAD_CORE_LOCAL_TMP_STACK_VA_END]orr     w1, w1, #THREAD_CLF_TMP /* flags |= THREAD_CLF_TMP; */

(2)、无条件跳转label指令

(偏移范围为 : ±128MiB)

  • b label
  • bl label

(3)、无条件跳转register指令

(偏移范围为 : 无限制)

  • br Xn
  • blr Xn
  • ret {Xn}

4、异常产生和返回

  • 异常产生指令 : 5个
  • 异常返回指令 : 1个
  • debug的异常指令 : 4个

(1)、异常产生指令

  • BRK Breakpoint Instruction BRK
  • HLT Halt Instruction //停止指令
  • HVC
  • SMC
  • SVC

(2)、异常返回指令

  • ERET

(3)、debug的异常指令

DCPS1 Debug switch to Exception level 1
DCPS2 Debug switch to Exception level 2
DCPS3 Debug switch to Exception level 3
DRPS Debug restore PE state

5、系统访问指令

  • 系统寄存器访问指令 : 1个
  • 系统操作指令 : 6个

(1)、系统寄存器访问指令

  • MRS
  • MSR

(2)、系统操作指令

  • SYS
  • SYSL
  • IC
  • DC
  • AT
  • TLBI

6、提示指令Hint instructions

提示指令Hint instructions : 8个

  • NOP
  • YIELD
  • WFE
  • WFI
  • SEV
  • SEVL
  • HINT
  • DGH

7、Barriers指令

Barriers指令 : 4个

  • CLREX // Clear Exclusives monitor
  • DMB
  • DSB
  • ISB

还有一些特殊的barriers指令,如果未实现,则等效于 NOP
CSDB
ESB
PSB
PSSB
SB
SSBB
TSB

7、指针授权指令:Pointer authentication instructions

有很多寄存器,目前(2020)基本没有使用,暂不介绍

8、存取指令 : Loads and stores

(1)、存取指令的寻址模式


[Rn, offset]! 前变址寻址
最终访问内存的地址 = Rn+offset
操作后Rn的值 = Rn+offset

[Rn], offset 后变址寻址
最终访问内存的地址 = Rn
操作后Rn的值 = Rn+offset

[Rn, offset] 偏移寻址
最终访问内存的地址 = Rn+offset
操作后Rn的值不变

 注意:对于偏移寻址,还可以使用寄存器偏移寻址、扩展寄存器偏移寻址[base,Xm{,LSL #imm}][base,Wm,(S|U)XTW {#imm}]

示例:
(1)、在进程切换调用的cpu_switch_to函数中,使用到了后变址寻址

ENTRY(cpu_switch_to)mov  x10, #THREAD_CPU_CONTEXTadd x8, x0, x10mov  x9, spstp   x19, x20, [x8], #16     // store callee-saved registersstp  x21, x22, [x8], #16stp  x23, x24, [x8], #16stp  x25, x26, [x8], #16stp  x27, x28, [x8], #16stp  x29, x9, [x8], #16str   lr, [x8]add x8, x1, x10ldp  x19, x20, [x8], #16     // restore callee-saved registersldp    x21, x22, [x8], #16ldp  x23, x24, [x8], #16ldp  x25, x26, [x8], #16ldp  x27, x28, [x8], #16ldp  x29, x9, [x8], #16ldr   lr, [x8]mov sp, x9
#ifdef CONFIG_THREAD_INFO_IN_TASKmsr    sp_el0, x1
#elseand    x9, x9, #~(THREAD_SIZE - 1)msr  sp_el0, x9
#endifret
ENDPROC(cpu_switch_to)

(2)、load/store指令的介绍

术语:

sign-extends :符号扩展,前面补符合位和0
zero-extends :0扩展,即前面补0S : sign-extends
B : byte
H : half-word
R :register
P : pair 双字操作
a、Load-Store Pair
LDP Wt1, Wt2, addr  //从addr处读取两个word到Wt1和Wt2
LDP Xt1, Xt2, addr  //从addr处读取两个double-word到Xt1和Xt2
LDPSW Xt1, Xt2, addr  //从addr处读取两个word到Xt1和Xt2, sign-extends
STP Wt1, Wt2, addr  //将Wt1和Wt2写入addr地址处
STP Xt1, Xt2, addr  //将Xt1和Xt2写入addr地址处
b、LDNP and STNP 非暂存指令

非暂存指令(Non-temporal),不会加载到cache

LDNP Wt1, Wt2, [base,#imm]
LDNP Xt1, Xt2, [base,#imm]
STNP Wt1, Wt2, [base,#imm]
STNP Xt1, Xt2, [base,#imm]
c、Load-Store Unprivileged

在EL1中执行数据的加载和写入,权限等是按照EL0的配置来执行

LDTR Wt, [base,#simm9]
LDTR Xt, [base,#simm9]
LDTRB Wt, [base,#simm9]  加载一个字节并sign-extends扩展到Wt, 在EL1下执行的,但是按照EL0的权限来执行
LDTRSB Wt, [base,#simm9]
LDTRSB Xt, [base,#simm9]
LDTRH Wt, [base,#simm9]
LDTRSH Wt, [base,#simm9]
LDTRSH Xt, [base,#simm9]
LDTRSW Xt, [base,#simm9]
STTR Wt, [base,#simm9]
STTR Xt, [base,#simm9]
STTRB Wt, [base,#simm9]
STTRH Wt, [base,#simm9]
d、Load-Store Exclusive

【补充armv8的exclusive操作】

为了解决多核情况下的锁竞争问题,arm引入了exclusive操作,并添加了相应的指令。
exclusive的操作的核心,就是会将锁,用一个状态机进行维护,该状态机有2种状态,open状态和exclusive状态。要想成功的对锁进行上锁,状态必须要从exclusive状态切换到open状态,其他状态,都是失败的。
LDXR指令,将状态从open状态切换到exclusive状态,STXR指令,将状态从exclusive状态切换到open状态

术语 : (R-register,  P-pair)
LDXR Wt, [base{,#0}]
LDXR Xt, [base{,#0}]
LDXRB Wt, [base{,#0}]
LDXRH Wt, [base{,#0}]
LDXP Wt, Wt2, [base{,#0}]
LDXP Xt, Xt2, [base{,#0}]
STXR Ws, Wt, [base{,#0}]
STXR Ws, Xt, [base{,#0}]
STXRB Ws, Wt, [base{,#0}]
STXRH Ws, Wt, [base{,#0}]
STXP Ws, Wt, Wt2, [base{,#0}]
STXP Ws, Xt, Xt2, [base{,#0}]
e、Load-Acquire / Store-Release

标记物理地址为非独占访问

(Non-exclusive)

LDAR Wt, [base{,#0}]
LDAR Xt, [base{,#0}]
LDARB Wt, [base{,#0}]
LDARH Wt, [base{,#0}]
STLR Wt, [base{,#0}]
STLR Xt, [base{,#0}]
STLRB Wt, [base{,#0}]
STLRH Wt, [base{,#0}]

(Exclusive)

LDAXR Wt, [base{,#0}]
LDAXR Xt, [base{,#0}]
LDAXRB Wt, [base{,#0}]
LDAXRH Wt, [base{,#0}]
LDAXP Wt, Wt2, [base{,#0}]
LDAXP Xt, Xt2, [base{,#0}]
STLXR Ws, Wt, [base{,#0}]
STLXR Ws, Xt, [base{,#0}]
STLXRB Ws, Wt, [base{,#0}]
STLXRH Ws, Xt|Wt, [base{,#0}]
STLXP Ws, Wt, Wt2, [base{,#0}]
STLXP Ws, Xt, Xt2, [base{,#0}]

[ARM-assembly]-ARMv8-A64指令集总结和学习相关推荐

  1. ARMv8 A64 汇编中立即数范围问题分析

    问题描述 ARMv8 A64汇编中,立即数是如何表示的?不同的指令对于立即数的表示有差异吗? 在Stackoverflow上发现类似的讨论:https://stackoverflow.com/ques ...

  2. ARMv8 Cortex-a 编程向导手册学习_6.aarch64 应用移植注意事项与 AArch64 ABI

    /* TODO 本系列文章是对 ARMv8 Cortex-a 系列编程向导手册拙劣的翻译和注解,若有出入,以官方文档为准 */ Chapter 8 移植到 A64 这一章节不打算对如何编写可移植代码做 ...

  3. ARM assembly instruction set 汇总(一)

    ARM Core指令现在越来越强大,同时又因此能耗低,现在越来越广泛地应用于移动设备中.随着3G时代的到来,各种移动终端设备中都有多媒体功能,而且是功能越多且性能越优.很多smartphone上都能播 ...

  4. 基础篇(三).A64指令集

    A64指令集 本篇只对A64指令集进行总结. 1.A64汇编指令简介 A64指令只能运行在AARCH64环境中 所有A64汇编指令都是32bit位宽 A64支持全部大写或全部小写的书写方式 寄存器命名 ...

  5. ARM汇编:乘法指令集

    ARM汇编:乘法指令集

  6. ARM体系架构—ARMv7-A指令集:内存操作指令

    ARM体系架构-ARMv7-A指令集 一.ARMv7-A指令集 一.ARMv7-A内存操作指令 二.单寄存器寻址内存操作指令 三.多寄存器寻址内存操作指令 四.SWP,SWPB 一.ARMv7-A指令 ...

  7. ARM体系架构—ARMv7-A指令集:协处理器指令

    ARM体系架构-ARMv7-A指令集 一.ARMv7-A指令集 二.ARMv7-A协处理器 二.ARMv7-A协处理器指令 三.读懂Linux Kernel协处理器指令 一.ARMv7-A指令集 AR ...

  8. ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM

    ARM的六大类指令集---LDR.LDRB.LDRH.STR.STRB.STRH ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则 ...

  9. android armv8 手机,智能手机已经将Arm的Armv8架构用于其处理器

    看来智能手机将变得比现在强大得多.Android Authority报告称,新的Arm Armv9架构将使智能手机更上一层楼.如许多用户所知,就性能而言,处理器的体系结构非常重要.该体系结构定义了处理 ...

最新文章

  1. DataGrid和GridView单击背景变色双击颜色还原
  2. 超详细的Spring Cloud全面总结2W字(建议收藏)
  3. 【图像分类】 基于Pytorch的细粒度图像分类实战
  4. 指定module_一个缺失已久的特性 — module模块
  5. 设计模式笔记二十四:模板模式
  6. ORA-29538、ORA-29532、ORA-29913问题解决
  7. php与html网页制作,web 一个简单地三级网页的设计和编写,html+css,适合学习 制作的新手 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  8. inlfuxdb版本_InfluxDB安装及配置
  9. BZOJ.4842.[NEERC2016]Delight for a Cat(费用流)
  10. 2021年上半年软件设计师上午真题及答案解析
  11. c语言存储转置矩阵,C语言实现矩阵转置(附带源码)
  12. 【oracle报错】/usr/bin/ksh conflicts between attempted installs of pdksh-5.2.14-30.x86_64
  13. AbstractApplicationContext#refresh
  14. 容联云(第三方短信发送)
  15. SubstanceDesigner制作PBR材质制作并且同步到Unity小尝试
  16. 假期培训第一阶段的总结和第二阶段的总结
  17. 寄存器、缓存、内存、硬盘、存储器的理解
  18. 出现“性能监视器计数器要求”错误的解决办法
  19. 熟练使用计算机word,计算机基础word2010上机操作.doc
  20. 利用宝塔搭建在线文件收取助手-easypicker2

热门文章

  1. 什么是光纤的波长?看看有哪些是你不知道的!
  2. 天猫双11期间,阿里数据中心将由机器人完成巡检
  3. python自动操作excel_Python自动化办公之操作Excel
  4. 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和
  5. 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 0-1: malformed
  6. AI机器人:机器人语音文本智能交互之自定义软件——实现模拟中本聪与V神跨时空畅谈
  7. Dataset之LSUN:LSUN数据集的简介、安装、使用方法之详细攻略
  8. CV:利用cv2自带两步法haarcascade_frontalface_default.xml、_smile.xml实现对人脸、笑脸同时检测
  9. web模拟telnet
  10. 2017-2018-1 20155330 《信息安全系统设计基础》第11周学习总结