第三章 iOS汇编函数的本质 - 003-(1) -bl和ret
2018-05-08 本文已影响21人
我静静仰望着天空
bl和ret指令
bl标号:bl后边跟的是内存地址
1.将下一条指令的地址放入lr(x30)寄存器
2. 转到标号处执行指令
void A();
//定义一个函数
int sum(int a, int b){
return a + b;
}
int main(int argc, char * argv[]) {
sum(10, 20);
}
![](https://img.haomeiwen.com/i1901953/c970c98c29c7b7ad.png)
现在的lr的地址是co(上图),不用管它,是上一个函数的。
跳转到bl的sum,跳转到sum函数里去(如下图),跳到sum函数里。
上图中,断点下 一行是(0x104e0e918 mov w8,#0x0)。然后存到lr中。(如下图),接下来,我们输入(lldb)s后,此时的lr 是918,(如下图)。现在的lr和上图中的断点指向的下一行918正好对上。所以bl就是将下一条指令的地址放入lr(x30)寄存器
![](https://img.haomeiwen.com/i1901953/4acbcd5f5c2e7d41.png)
ret
ret类似return
默认使用lr(x30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址!
ARM64平台的特色指令,它面向硬件做了优化处理的
我们测试一下lr,手动输入给lr赋值一个,如下图
x30寄存器
x30寄存器存放的是函数的返回地址.当ret指令执行时刻,会寻找x30寄存器保存的地址值!
注意:在函数嵌套调用的时候.需要讲x30入栈!
![](https://img.haomeiwen.com/i1901953/c84ce8ecb5ba8d1d.png)
事实证明,ret 就是找lr(x30)
![](https://img.haomeiwen.com/i1901953/4e6d532bbf3c1097.png)