汇编(五)

汇编(五)_第1张图片
image.png

上篇文章我们了解了内存读写的指令,关于栈的操作.
接下来我们看下这个Demo

  • 新建项目(单个视图的空项目)
    CMD + SHIFT + N 选择真机(如果是模拟器汇编指令将不一样)


    image.png
  • CMD + N 新建文件,选择 Assembly File(Empty也可以,后缀名加上.s就OK)
汇编(五)_第2张图片
image.png
  • 写点汇编代码
.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汇编入门(十) — 循环选择判断
待续…

你可能感兴趣的:(汇编(五))