一.iphone X - arm64截图
lldb输入命令register read
-
x0 - x7
用来传参数,x0
也存储返回值(如果参数大于8个,多余的参数放到栈里面) -
x0 - x30
是31个通用整型寄存器 -
x29 : fp
保存栈帧地址(栈底指针) -
x30 : LR
保存子程序结束后需要执行的下一条指令 -
sp
保存栈顶指针,使用 SP/WSP来进行对SP寄存器的访问 -
pc
总是指向即将要执行的下一条指令,在arm64中,软件是不能改写PC寄存器的
CPSR
状态寄存器
- 第31位(0-31) N(Negative): 记录相关指令(add、sub、orr等逻辑或算数)执行后,其结果是否为负.如果为负,N=1 非负,N=0
- 第30位 Z(Zero): 记录相关指令后,结果为0,Z=1 非0,Z=0
- 第29位 C(Carry): 进位标识符,一般进行无符号数的运算.
加法运算:当运算结果产生了进位时(无符号数溢出), C=1 否则C=0
减法运算(包括CMP):当运算产生了借位时(无符号数溢出),C=0 否则C=1
tips: arm64是递减栈
栈是从高地址向低地址扩算,堆是从低地址向高地址扩散
二. 常用指令
- str :store register 将寄存器写入内存,入栈
- ldr : load register 将内存读到寄存器,出栈
- bl : b代表跳转, L代表lr寄存器, 跳转并给lr寄存器赋值
- ret : 让cpu执行lr寄存器里面的东西
- adrp (adress page, 一般和add同时出现): 找到常量或者全局变量所在的内存页(内存地址是分页管理的,每10k为一页)
网友评论