OC的反汇编
笔记暂时提交, 日后修正
1. OC方法本质
objc_msgSend(id , sel), 汇编打印x0, x1来获取 id ,以及 sel -> objc_msgSend
iOS9 [[对象 alloc] init] -> 两次objc_msgSend
iOS11 对象alloc -> objc_alloc + objc_msgSend (init)
iOS11 以后 (iOS 13.5测试情况) 对象alloc -> objc_alloc_init (不再走objc_msgSend)
创建对象后 (局部变量) -> objc_storeStrong (id * (对象指针) , id ) -> objc_storeStrong (&p, nil) -> objc_release
2. 工具反汇编
hopper, 烂苹果, IDA
block的反汇编 -> 找到invoke代码 (实现代码)
objc_retainBlock
hopper (汇编,流程图, 伪代码)
总结:
汇编: 函数那一块
1024 = 1k 数量单位
1024B (byte) = 1KB 容量单位
64位 -> 32个寄存器
w寄存器 x寄存器
pc寄存器 sp -> 栈顶 fp -> 栈底
sub sp 拉伸 -> 16字节对齐 !!
ldr (load register) -> 读 str (store register) -> 写
bl -> lr x30 (回家的路) -> ret读lr去返回上个函数
函数调用栈 -> 拉伸栈 (sub sp) -> 栈平衡 (add sp)
nzcv (32位) 状态寄存器 -> 最高四位
adrp 寻址 (adress page) -> pc寄存器 低12位清零 + offset
adrp x2 2 0x104dda060 + 2 = 0x104dda000 + 2
add x2 x2 #070 0x104ddc070
循环选择判断
cmp 比较 -> nzcv 状态寄存器 -> b
无符号判断 -> switch 两头掐
网友评论