0%

ARM64汇编分析常用指令、寄存器

ARM64 汇编快速查阅表 – 持续更新…

常用寄存器

FP(x29) 寄存器:64bit 栈底地址 通用寄存器

LR(x30) 寄存器:64bit 程序链接寄存器,保存了当前程序执行完毕后返回的地址

SP寄存器:64bit 栈顶地址 专用寄存器

w0寄存器:x0寄存器的低32位(以此类推)

wzr寄存器:32位清零寄存器

常用指令

伪操作命令

伪操作命令不是一个真正的命令,一般是在汇编代码中做标识符。例如对静态数据段中的数据类型进行描述

dd命令: 双字型,即4个字节。
dq命令: 4字型,即8个字节。

mov 指令

把右操作数或者右寄存器内的值存入左侧寄存器内

mov w9, #0x3ff
mov w9, x8

str 指令

存储指令:将某个寄存器内的32位的值存到存储器中

str x0, [x1], #0x8; 将x0中的4字节写入x1指向地址的存储器内,并将(x1 + 0x8)这个新地址写入 x1
str x0, [x1, #0x8]; 将x0中的4字节写入(x1 + 0x8)指向地址的存储器内

stur 指令

存储指令:将某个寄存器内的内容存储到右边的地址中

C++ 局部变量定义

1
2
mov w11, #0x3
stur w11, [x29, #-0x18]

ldr/ldur 指令

加载指令:将右边的地址中的值取出来放在左侧的寄存器内
ldr 的地址偏移值为正值,ldur 的地址偏移值为负值

ldr w8, [x9]
ldur x9, [x29, #-0x20]

sub 指令

减法指令:

sub x0, x1, x2 ; 将寄存器 x1 和 x2 的值相减后保存到寄存器 x0 中

stp 指令

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

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

adrp 指令

PC寄存器偏移指令:将pc寄存器和立即数按照规则计算后将值赋值给另一个寄存器

adrp x8, #0x10011000; 将PC寄存器的16进制的值,后三位清零后,加上立即数左移3位后的值,赋值给x8寄存器。

Q&A

FP/SP 寄存器

FP是一个通用寄存器,在「某些时刻」会保存栈底的地址。而SP是一个专用寄存器,它在任何时刻保存的都是当前栈的栈顶位置。