ARM64 学习

作者: 化二缺 | 来源:发表于2020-04-09 17:26 被阅读0次

iOS汇编

  • 真机 arm64汇编,GNU
  • 模拟器 x86, AT&T 汇编

寄存器 指令 堆栈

通用寄存器
  • 64bit的 :x0 到 x28
  • 32bit的 :w0 到 w28 (属于x0到 x28的低32bit)
  • x0 - x7 通常拿来存放函数的参数,更多的参数使用堆栈进行传递
  • x0 通常拿来存放函数的返回值
通用寄存器.png
程序计数器
  • pc (Program Counter)
  • 记录cpu 当前指令是那一条指令
  • 相当于存储当前cpu 正在执行的指令地址
  • 类似8086的ip寄存器
堆栈指针
  • sp (Stack Pointer)
  • fp (frame Pointer) ,也就是 x29
连接寄存器
  • lr (Link Reigister) 也就是 x30

register read lr 和 register read x30 一样
没有 w30 所以不是一般寄存器
存储着函数的返回地址(函数执行完之后应该返回的地址 并且往下执行)

程序状态寄存器
  • cpsr (Current Program Status Register)
  • spsr (Saved Program Status Register) ,异常状态下使用

指令

  • ret

    就是相当于 C 语言里面的 函数返回 return
    将 lr 里面的值赋值给pc 寄存器

  • mov

建议创建OC 工程 比较好操作 swift函数 没有。main函数

1. 创建相应文件.png 2. 汇编文件内容.png 3. 汇编头文件.png 4. main函数文件.png 5. 断点显示.png

新版本的Xcode 不会断在汇编语句上 断在函数上 单步跳进 可以实现

  • add
    ADD 目的寄存器 操作数1 操作数2
    ADD指令 用于把两个操作数相加 并将结果放到寄存器中,操作数1 应是一个寄存器 操作数2 可以是一个寄存器 被移位的寄存器或者一个立即数

ADD x2 , x4,#0x08 == [ x2 = x4 + #0x08 ]

  • sub
    SUB x2 , x4,x6 == [x2 = x4 -x6]
  • cmp

CMP x1,x2 ==[ x1 减 x2 ,结果影响 cpsr 寄存器 的标志位]

cpsr 寄存器.png cpsr寄存器含义.png
  • b

跳转指令 、可以带条件跳转,一般跟cmp配合使用

b指令说明.png 指令的条件域.png
  • EQ: equal, 相等
  • NE: not equal , 不相等
  • GT: great than ,大于
  • GE: great or equal, 大于等于
  • LT: less than ,小于
  • LE: less equal, 小于等于
  • bl指令
    带返回的b指令 ,b 跳转的函数里的ret 是无效的 只有 bl 跳转的函数里的ret 才会管用,类似 oc里面的函数调用 执行完函数后 继续执行下面的代码
    bl 后面也可以带条件

内存操作相关的指令

  • load ,从内存中装载数据
    • ldr, ldur
    • ldp (p 是 一对的意思)
  • store 往内存中存储数据
    • str ,stur
    • stp
    • 零寄存器
      • wzr(32bit Word Zero Register) 里面存储的值是0 用来清空某段地址
      • xzr (64bit)

    stur wzr,[x29 ,#-0x14]
    stur xzr,[x29, #-0x20]

CPU 寻址方式

  • 立即寻址


    立即寻址.png
  • 寄存器寻址


    寄存器寻址.png
  • 寄存器间接寻址


    寄存器间接寻址 .png
  • 基址变址寻址


    基址变址寻址.png
bl 指令和 b指令的区别
  • bl 会回到函数执行完的下一行

  • b 不会回到函数执行完的下一行

  • b指令只是进行跳转

  • bl指令 1.将一下条指令的地址存储到 lr 寄存器 2.跳转执行

  • ret 是将 lr 的值赋值给pc

堆栈

  • sp (Stack Pointer)

  • fp (frame Pointer) ,也就是 x29

  • 函数的类型

  • 叶子函数 (内部不再调用其他函数的函数)
  • 非叶子函数
    1. fp(x29) 和 sp(x30) 之间的空间是函数本身需要的空间
    2. fpsp 都需要重新赋值
    3. 会存储 lr 因为要调用其他函数 执行完要回到原处 往下执行

部分LLDB 指令

image.png

相关文章

  • ARM64汇编学习笔记一(初始汇编)

    ARM64汇编学习笔记一(初始汇编)

  • ARM64 学习

    iOS汇编 真机 arm64汇编,GNU 模拟器 x86, AT&T 汇编 寄存器 指令 堆栈 通用寄存器 64b...

  • ARM64学习1

    ARM64学习--assembly language 语言之间的关系 汇编语言与机器语言一一对应,每一条机器指令都...

  • ARM64学习2

    ARM64 计算机中常见的数据宽度 位(Bit):1个二进制位 字节(Byte):一个字节有8个Bit组成,内存中...

  • Arm64 学习笔记

    是课堂笔记,仅供自己复习使用 bl 指令 跳转 ,将下一条指令放入lr(X30)寄存器ret 返回到lr 寄存器...

  • ARM64汇编入门 - 汇编基础

    ARM64汇编入门 - 汇编基础ARM64汇编入门 - 汇编基础

  • ARM64汇编入门

    现在iOS设备几乎已经都是ARM64架构,此外,Mac M1芯片的电脑也是基于ARM64架构,本文对ARM64汇...

  • sdk 打包错误汇总 2021-09-15

    1.提示 relase 和simulator arm64 重复 方法:release 模式去除模拟器arm64

  • 树莓派ubuntu添加apt源

    树莓派是arm64的,网络上很多文章给的源都是 殊不知这个源是不包含arm64的,我的是树莓派4b,arm64的,...

  • Runtime(一)

    isa 在arm64 之前,isa就是一个普通的指针,它指向classormeta-class 在arm64之后,...

网友评论

    本文标题:ARM64 学习

    本文链接:https://www.haomeiwen.com/subject/rdlqmhtx.html