上篇文章我们了解了内存读写的指令,关于栈的操作.
接下来我们看下这个Demo
-
新建项目(单个视图的空项目)
CMD + SHIFT + N 选择真机(如果是模拟器汇编指令将不一样)
- CMD + N 新建文件,选择 Assembly File(Empty也可以,后缀名加上.s就OK)
- 写点汇编代码
.text
.global _A,_B
_A:
mov x0,#0xaaaa
bl _B
mov x0,#0xcccc
ret
_B:
mov x0,#0xbbbb
ret
- 来到main.m文件
void A();
int main(int argc, char * argv[]){
printf("A");
A();
printf("B");
}
运行的结果是怎样? 死循环为什么会这样?带着这样的疑问我们来看下接下来的两条指令和一个寄存器.
bl和ret指令
bl标号
- 将下一条指令的地址放入lr(x30)寄存器
- 转到标号处执行指令
ret
- 默认使用lr(x30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址!
ARM64平台的特色指令,它面向硬件做了优化处理的
x30寄存器
x30寄存器存放的是函数的返回地址.当ret指令执行时刻,会寻找x30寄存器保存的地址值!
注意:在函数嵌套调用的时候.需要将x30入栈!
ARM汇编入门(一) — 进制本质
ARM汇编入门(二) — 寄存器&pc&bl指令
ARM汇编入门(三) — 寄存器&cpu补充
ARM汇编入门(四) — 栈SP&FP寄存器
ARM汇编入门(五) — bl&ret函数的调用与返回
ARM汇编入门(六) — 函数的参数和返回值
ARM汇编入门(七) — 函数的局部变量与嵌套调用
ARM汇编入门(八) — 状态寄存器
ARM汇编入门(九) — 内存分区全局变量和局部变量
ARM汇编入门(十) — 循环选择判断
待续…