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 两头掐