> 文章列表 > 2、函数的本质

2、函数的本质

2、函数的本质

    • 是一种具有特殊的访问方式的存储空间(后进先出, Last In Out First, LIFO)
    • SP和FP寄存器
      • sp寄存器在任意时刻会保存我们栈顶的地址
      • fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址
    • ARM64里面 对栈的操作是16字节对齐的
    • 栈的读写指令
      • 读: ldr(load register)指令 LDR、LDP
      • 写: str(store register)指令 STR、STP
    • 汇编练习:
      • 指令:
        • sub sp,sp, #0x10; 拉伸栈空间16字节
        • stp x0,x1,[sp]; 往sp所在位置存放x0和x1
      • 简写
        • stp x0, x1, [sp, #-0x10]!
  • bl指令
    • 跳转指令: bl 标号, 表示程序执行到标号处.将下一条指令的地址保存到lr寄存器
      • b 代表着跳转
      • l 代表lr(X30)寄存器
  • ret指令
    • 类似函数中return
    • 让CPU执行lr寄存器所指向的指令
  • 函数
    • 函数调用栈
      • ARM64中栈是递减栈,向低地址延伸的栈
      • SP寄存器指向栈顶的位置
      • x29(FP)寄存器指向栈底的位置
    • 函数返回值
      • 默认情况下函数的返回值放在x0寄存器
      • 如果放不下就会利用内存.写入上一个调用栈的内部.用x8寄存器作为参照.如果返回值大于8个字节.就会利用内存传递返回值
    • 函数的参数
      • ARM64中, 默认情况下使用x0到x7这8个寄存器
      • 如果是浮点数就是用浮点寄存器
      • 如果个数大于8个就使用栈传递
    • 函数的局部变量
      • 使用栈保存局部变量
    • 函数嵌套调用: 会将x29、x30寄存器入栈保护