一、bl指令
bl:即调函数。调用完函数后返回原代码,继续玩下执行。
相当于在代码中调用一个函数,函数调用完后继续往下执行原代码。
1、汇编代码bl
2、OC代码中看汇编bl
二、ldr指令
ld:load,即读取的意思
ldr:取内存中的数据,放到另一个寄存器中。
涉及到内存寻址
的问题。
1、内存寻址
2、代码
三、ldur指令
ldur与ldr的区别:
ldr用于正数(偏移值是正数);
ldur用于负数(偏移值是负数)。
四、ldp指令
ldp:load pair ,一对寄存器
根据地址读取一对数据,按地址顺序赋值给一对寄存器:
1、先赋值给第一个寄存器;
2、偏移地址后,取值赋值给第二个寄存器。
五、str、stur、stp指令
st:store,存储。
str:往内存中写数据(偏移值为正)
stur:往内存中写数据(偏移值为负)
stp:
p:pair
stp:store pair,存放一对数据
一对数据,从右边那个地址开始按顺序存放。
格式:寄存器写在左边,内存寻址写右边。
五、wzr、xzr寄存器
wzr:4字节,不能在lldb中读,也不能在lldb中写
xzr:8字节,不能在lldb中读,也不能在lldb中写
lldb读不出来:
但是在代码里是能写的:
为什么要有0寄存器呢?
——因为,如果我们要把某块内存置零的话,是不能这么写立即数的:
str #0x0, [x1]
虽然可以这么写:
但清零这种操作很常见,false,NO,nil等都是清零操作,所以专门设计出存储0的寄存器
六、pc、lr寄存器
1、pc寄存器
2、演示lr寄存器
七、bl指令的本质
b指令的事情就一件,找到标记,跳转,开始执行代码。
bl指令:跳转,返回。(bl跟ret配合使用)
lr:在bl跳转之前,会将下一行代码的地址赋值给lr寄存器。
ret的本质:函数返回——将lr(x30)寄存器的值赋给pc寄存器。
八、函数的分类
叶子函数:里面没有别的函数了;
非叶子函数:里面还有别的函数。
把oc文件转成汇编,乱七八糟的东西太多了,把c文件转成汇编,比较纯净。
c文件转成汇编指令:
xcrun --sdk iphoneos clang -S -arch arm64 main.c -o main.s