参考<ARM 64-Bit Assembly Language.pdf>

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

文章目录

  • 一、基础语法
    • 1、先看一个示例
    • 2、分配和初始化全局变量
    • 3、对齐aligning
    • 4、函数
    • 5、条件
    • 6、include文件
    • 7、宏Macros
  • 二、指令介绍
    • 1、instruction set architecture (ISA)框图
    • 2、AArch64 general registers
    • 3、condition flags
    • 4、Load/store
      • (1)、Load/store single register
      • (2)、Load/store single register (unscaled)
      • (3)、Load/store pair 一次性读写两个寄存器
  • 三、Branch分支
    • 1、Branch
    • 2、Branch to Register
    • 3、Branch and link
    • 4、Compare and branch
    • 5、Form PC-relative address

★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★

一、基础语法

1、先看一个示例

写一个简单的c语言程序

把它翻译成汇编语言是这样的:

把C语言编译成汇编语言,其实是这样的:

补充一下stp ldp的知识:
stp ldp是双double-word操作

  • ARM64 开始就取消了32位的 LDM,STM,PUSH,POP指令,取而代之的是str\stp、ldr\ldp
  • ARM64 里面对栈的操作是16字节对齐

补充一下fp和sp的知识:
x29是FP,x30是LR

  • sp寄存器在任意时刻会保存栈顶的地址
  • fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址

为何要保存X29 X30

  • 当此函数为叶子函数时,就不需要在对 x29 和 x30 寄存器的保护。 叶子函数:函数里面不再调用其他函数。
  • 当函数中的参数还有其他函数的引用时,需要对参数入栈,进行保护,以防引起数据错误。

2、分配和初始化全局变量

(示例)


疑问: 如何定义一个未初始化的static静态局部变量和全局变量?

语法格式:

.byte expressions.2byte expressions
.hword expressions
.short expressions.4byte expressions
.word expressions
.long expressions.8byte expressions
.quad expressions.ascii "string"  //带'\n'.asciz "string"  //不带'\n'
.string "string.float flonums
.single flonums.double flonums

3、对齐aligning

.align abs-expr, abs-expr, abs-expr
第一个abs-expr: 对齐的size
第二个abs-expr: 填充
第二个abs-expr: 可选,对齐应该跳过的最大字节数.balign[lw] abs-expr, abs-expr, abs-expr.skip size, fill
.space size, fill
分配一大块内存并将其全部初始化到相同的值,可以使用这两个指令.equ symbol, expression
.set symbol, expression
宏定义,等价define.equiv symbol, expression
宏定义,如果已经定义过了,则产生error.global symbol
.globl symbol
声明,声明后,所有文件都可以使用.comm symbol, length

4、函数

.size name,expression

.type name,type_description

5、条件

.if expression
.ifdef symbol
.ifndef symbol
.else
.endif

6、include文件

.include "file"

7、宏Macros

.macro macname
.macro macname macargs ...
.endm
.exitm


(宏也是有递归宏的)
‘enum 0,5’相当于

二、指令介绍

1、instruction set architecture (ISA)框图

2、AArch64 general registers



General purpose registers

Frame pointer —x29
Link register —x30
Stack pointer —sp
Zero register —xzr
Program counter —pc
PSTATE register

3、condition flags


4、Load/store

(1)、Load/store single register

ldr Load Register
str Store Register
在寄存器和memory之间传输double-word, single word, half-word, byte

语法:
<op>{<size>} Rd, <addr>
The op are:
b unsigned byte
h unsigned half-word
sb signed byte
sh signed half-word
sw signed word
示例:
ldr w8, [x4]
strb x12, [x2]
ldr x5, [x3, #7]!  前变址寻址
strh w9, [x6], #7  后变址寻址
ldrsh x5, [x0, 8]
strb w1, [x9]
ldrsh x5, [x0, 8]
strb w1, [x9]
(2)、Load/store single register (unscaled)

ldur Load Register (Unscaled)
stur Store Register (Unscaled).
特点别ldr str多了一个u而已,offset在 [−256, 256]之间

语法:
<op>{<size>} Rd, [Xn, #imm9]
The op are:
b unsigned byte
h unsigned half-word
sb signed byte
sh signed half-word
sw signed word
示例:
ldursb x4, [x5, #255]
stur x1, [x2, #-256]
(3)、Load/store pair 一次性读写两个寄存器
stp x29, x30, [sp, #-16]!
ldp x29, x30, [sp], #16

三、Branch分支

• Branch,
• Branch to Register,
• Branch and Link (subroutine call),
• Compare and Branch, and
• Form program-counter-relative Address.

1、Branch

b Branch //无条件跳转, ±128 MB范围
b{} <target_label> //有条件跳转, ±1 MB范围

b main
bvs overflow

2、Branch to Register

br Xn
ret {Xn}

3、Branch and link

bl <target_address>
blr Xn
其实就是在跳转之前,先将PC+4的地址保持到X30(LR)中

4、Compare and branch

cbz Compare and Branch if Zero,
cbnz Compare and Branch if Nonzero,
tbz Test Bit and Branch if Zero, and
tbnz Test Bit and Branch if Nonzero.

cb{n}z Rt,
tb{n}z Rt, #imm6,

• The cbz and cbnz instructions have a range of ±1 MB (encoded in 19 bits).
• The range of the tbz and tbnz instructions is ±32 KB (encoded in 14 bits).

5、Form PC-relative address

adr Form PC-Relative Address
adrp Form PC-Relative Address to 4 KB Page

它比ldr Rx,=label更加啊高效,它在两个cycle周期就可以计算这个64bit地址,无需访问memory

[ARM-assembly]-ARM64汇编语言学习笔记相关推荐

  1. 32位汇编语言学习笔记(45)--测试简单文件操作接口(完)

     这是<Assembly Language step by step programming with linux>书中的最后一个程序,也是全书中的最复杂的一个程序. 首先看一下这个程 ...

  2. MIPS汇编语言学习笔记23:if 语句分支指令

    C语言 #include<stdio.h> int main() {int i = 3;if (i < 5){printf("yes!\n");}else{pri ...

  3. MIPS汇编语言学习笔记07:打印双精度浮点数

    课程原视频: https://www.bilibili.com/video/BV19J411y7pA?p=7 程序功能: 设定两个双精度浮点型数据,将其相加后打印输出. 代码: .datamyDoub ...

  4. windows下32位汇编语言学习笔记

    windows下32位汇编语言学习笔记 第一章  第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...

  5. win32汇编语言学习笔记(三)

    汇编语言学习笔记(三) CH3.Windows汇编基础 .386 .model flat,stdcall option casemap:none 定义程序使用的指令集.工作模式 相应的还有:.8086 ...

  6. MIPS汇编语言学习笔记11:整数减法 (mult方法)

    任务:整数相乘,并输出打印. 代码: .dataintA: .word 5intB: .word 2 .textli $v0, 1lw $a1, intAlw $a2, intBmult $a1, $ ...

  7. 菜鸟的汇编语言学习笔记

    汇编语言学习笔记 1.1机器语言 计算机发展初期,人们都是用机器语言进行编程的,这也是人们能实现编程控制计算机的最低级别.那么机器语言是什么样子的呢?就是用0和1组成的一个串(形如011010101) ...

  8. ARM汇编语言学习笔记

    汇编是对寄存器操作的,不知道一些和主控制器相关的寄存器的作用,根本无法理解某些指令,所以先自己学习相关寄存器和工作模式. 下面是<ARM 嵌入式体系结构与接口技术(Cortex-A8 版) &g ...

  9. Linux下汇编语言学习笔记12 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

最新文章

  1. PHP获取时间排除周六、周日的两个方法
  2. 【ApsaraSRE专题推荐--1期】Sedawk笔记系列
  3. Android实战技术:深入理解Android的RPC方式与AIDL
  4. How to bind multiple properties with formatter on one control from Ke
  5. IDEA @Override is not allowed when implementing interface method(转载)
  6. [2021.4.7多校省选模拟33]A,B,C
  7. 很用心的为你写了 9 道 MySQL 面试题,建议收藏!
  8. 7a系列mrcc xilinx_artix-7A200T的输入时钟(50M)管脚接到MRCC的N端了,怎么解决?
  9. 关于PCB板热设计的学习总结
  10. C#中LitJson的使用示例 LitJson官方下载链接
  11. uniapp 获取屏幕高度
  12. PHP 对接阿里云短信
  13. 【软考系统架构设计师】2019年下系统架构师案例分析历年真题
  14. 网络安全笔记5——数字签名
  15. API电商平台获取淘宝商品详情
  16. 【LeetCode-中等】55. 跳跃游戏(详解)
  17. matlab中提示m文件不在current folder下(实际上在)
  18. 【小程序】第一个小程序——创建小程序项目
  19. MySQL:常用的MySQL优化工具
  20. 智能工艺并不等同于计算机辅助工艺,关于人工智能技术在计算机辅助工艺设计中应用的探讨...

热门文章

  1. 浅谈数据中心IT机房的空气调节(上篇)-气流遏制
  2. 数据中心管理将成为未来十年所需的技能
  3. 本质矩阵svd分解_SVD推荐系统
  4. DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率
  5. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
  6. python+requests+re匹配抓取猫眼上映电影信息
  7. [转帖]最值得了解的10大开源技术
  8. [leetcode] 22. Generate Parentheses(medium)
  9. centos6.7一键装机
  10. springboot 单元测试