Arm64汇编

这篇主要介绍常见ARM64寄存器、汇编指令,对于我们在调试、分析程序时有一定的帮助

寄存器

通用寄存器

  • 64bit: x0 ~ x28
  • 32bit: w0 ~ w28 (属于x0 ~ x28得低32位)
  • x0 ~ x7通常用来存放函数参数,更多得参数用堆栈来传递
  • x0通常用来存放函数得返回值

程序计数器

  • pc(PRogram Counter)
  • 记录CPU当前指令的地址
  • 类似8086汇编的ip寄存器

堆栈指针

  • sp(Stack Pointer)
sub sp, sp, #0x60 ; =0x60
  • fp(Frame Pointer),也就是x29,和sp配合确定函数栈空间

链接寄存器

  • lr(Link Register),也就是x30
  • 存放着函数的返回地址

程序状态寄存器

  • cpsr(Current Program Status Register)

  • spsr(Saed Program Status Register),异常状态下使用

零寄存

  • 里面存储的值是0,一般用于清空操作
  • wzr(32bit,Word Zeor Register)
  • xzr(64bit)
str xzr, [sp, #0x28] ;将sp偏移0x28位置的值置为零

指令

  • mov
    • 赋值
mov x1, #0x1 ;立即数0x1赋值给x1
  • ret

    • 函数返回
    • 将lr(x30)寄存器的值赋值给pc寄存器
  • add

add x0, x1, x2 ;x1、x2加的结果赋值给x0
  • sub
sub x0, x1, x2 ;x1、x2相减的结果赋值给x0
  • cmp

    • 将两个寄存器相减
    • 结果会影响cpsr寄存器的标志位
  • b

    • 跳转指令
    • 可以带条件跳转,一般跟cmp配合使用
    • 跳转后指令会往下执行,如果中间有指令,则会被跳过
  • bl

    • 带返回的跳转指令,一般配合cmp使用
    • 执行过程
      • 将吓一跳指令的地址存储到lr寄存器中
      • 跳转到标记处开始执行代码
cmp x0 x1
beq func ;比较x0、x1是否相等,相等则跳转到func
  • 条件域

    • EQ 等于
    • NE 不等
    • GT 大于
    • GE 大于等于
    • LT 小于
    • LE 小于等于
  • 内存操作

    • load
      • 从内存中读取数据
      • ldr、ldur
      • ldp(p为pair)
    ldr x0 [x1, #0x01] ;x1偏移0x01地址的8字节的值赋值给x0
    ldur x0 [x1, -#0x01] ;x1偏移-0x01地址的8字节的值赋值给x0
    ldp w0 w1 [x1, #0x01] ;x1偏移-0x01地址的8字节的值赋值给地位w1,高位w0
    
    • store
      • 往内存中存入数据,左边不能放立即数
      • str、stur
      • stp
    str x0 [x1, #0x02] ;x0的8字节值赋值到x1偏移0x02的位置
    stur x0 [x1, -#0x02] ;x0的8字节值赋值到x1偏移-0x02的位置
    stp w0 w1 [x1, #0x02] ;w0、w1的值赋值到x1偏移0x02的位置