- 栈
- 是一种具有特殊的访问方式的存储空间(后进先出, 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)寄存器
- 跳转指令: bl 标号, 表示程序执行到标号处.将下一条指令的地址保存到lr寄存器
- ret指令
- 类似函数中return
- 让CPU执行lr寄存器所指向的指令
- 函数
- 函数调用栈
- ARM64中栈是递减栈,向低地址延伸的栈
- SP寄存器指向栈顶的位置
- x29(FP)寄存器指向栈底的位置
- 函数返回值
- 默认情况下函数的返回值放在x0寄存器
- 如果放不下就会利用内存.写入上一个调用栈的内部.用x8寄存器作为参照.如果返回值大于8个字节.就会利用内存传递返回值
- 函数的参数
- ARM64中, 默认情况下使用x0到x7这8个寄存器
- 如果是浮点数就是用浮点寄存器
- 如果个数大于8个就使用栈传递
- 函数的局部变量
- 使用栈保存局部变量
- 函数嵌套调用: 会将x29、x30寄存器入栈保护
- 函数调用栈
文章来源地址https://www.toymoban.com/news/detail-419797.html
文章来源:https://www.toymoban.com/news/detail-419797.html
到了这里,关于2、函数的本质的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!