2、函数的本质
网友:sslake
文章列表
2024-03-22 01:53:18
- 栈
- 是一种具有特殊的访问方式的存储空间(后进先出, 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寄存器
- ret指令
- 类似函数中return
- 让CPU执行lr寄存器所指向的指令
- 函数
- 函数调用栈
- ARM64中栈是递减栈,向低地址延伸的栈
- SP寄存器指向栈顶的位置
- x29(FP)寄存器指向栈底的位置
- 函数返回值
- 默认情况下函数的返回值放在x0寄存器
- 如果放不下就会利用内存.写入上一个调用栈的内部.用x8寄存器作为参照.如果返回值大于8个字节.就会利用内存传递返回值
- 函数的参数
- ARM64中, 默认情况下使用x0到x7这8个寄存器
- 如果是浮点数就是用浮点寄存器
- 如果个数大于8个就使用栈传递
- 函数的局部变量
- 函数嵌套调用: 会将x29、x30寄存器入栈保护