美文网首页
第三章 iOS汇编函数的本质 - 003-(1) -bl和ret

第三章 iOS汇编函数的本质 - 003-(1) -bl和ret

作者: 我静静仰望着天空 | 来源:发表于2018-05-08 15:14 被阅读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);

}

bl跳转,跳转到sum函数里去。s跳转到sum函数中

现在的lr的地址是co(上图),不用管它,是上一个函数的。

跳转到bl的sum,跳转到sum函数里去(如下图),跳到sum函数里。

上图中,断点下 一行是(0x104e0e918  mov w8,#0x0)。然后存到lr中。(如下图),接下来,我们输入(lldb)s后,此时的lr 是918,(如下图)。现在的lr和上图中的断点指向的下一行918正好对上。所以bl就是将下一条指令的地址放入lr(x30)寄存器

ret

  ret类似return

  默认使用lr(x30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址!

  ARM64平台的特色指令,它面向硬件做了优化处理的

  我们测试一下lr,手动输入给lr赋值一个,如下图

x30寄存器

x30寄存器存放的是函数的返回地址.当ret指令执行时刻,会寻找x30寄存器保存的地址值!

注意:在函数嵌套调用的时候.需要讲x30入栈!

事实证明,ret 就是找lr(x30) 

相关文章

网友评论

      本文标题:第三章 iOS汇编函数的本质 - 003-(1) -bl和ret

      本文链接:https://www.haomeiwen.com/subject/xnmvrftx.html