bl和ret指令
bl标号:bl后边跟的是内存地址
1.将下一条指令的地址放入lr(x30)寄存器
2. 转到标号处执行指令
bl跳转,跳转到sum函数里去。s跳转到sum函数中void A();
//定义一个函数
int sum(int a, int b){
return a + b;
}
int main(int argc, char * argv[]) {
sum(10, 20);
}
现在的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)
网友评论