这篇主要介绍常见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的位置
- load