当前位置: 首页 > news >正文

golang 函数调用栈笔记

 

一个被函数在栈上的情况:(栈从高地址向低地址延伸)

  • 返回地址(函数执行结束后,会跳转到这个地址执行)
  •  BP(函数的栈基)
  • 局部变量
  • 返回值(指的是函数返回值,eg: a := function() ,这里的a就是返回值)(golang现在将返回值存到寄存器?待确认)
  • 参数
  • SP(函数栈指针)

函数栈帧会一次性分配,然后通过sp + 偏移量的方式来定位位置,当一个函数内调用多个函数时,会根据最大的函数栈帧来给每个函数分配栈帧。

call指令

在调用函数时,编译器会执行call指令,call指令主要有两步操作:

  1. 将下一条指令的地址入栈 (这里的下一条指令地址也就是返回地址)
  2. 将ip寄存器指向代码段的被调用函数处

ret指令

当函数执行完成后,编译器会执行ret指令:

  1. 将返回地址弹出
  2. 跳转到返回地址

一个函数被调用的完整顺序

call指令 ——> sp指针向下移动,分配足够大栈帧空间 ——> 将调用者栈基bp复制入栈(为区分记为bp1)——>将bp1存到寄存器——>执行函数——>将寄存器的值恢复为bp——>释放栈帧——> ret指令

return与defer的执行顺序:

  1. return给返回值赋值
  2. defer函数执行
  3. return返回返回值


详情见幼麟实验室 

 

http://www.lryc.cn/news/69099.html

相关文章:

  • 云端一体助力体验升级和业务创新
  • 【Linux Network】高级IO
  • Python语言基本控制结构
  • 旅游网站版面设计方案
  • sudo unable to open read-only file system”的原因
  • Dynamics 365 DevOps CI/CD之WebResource
  • Linux常用指令及基础配置
  • Linux 服务器上Nvidia相关指令
  • ChatGPT的工作原理是什么?
  • C++进阶——红黑树
  • 什么是NTFS for Mac?2023新版本如何下载
  • Python泰裤辣丨520写一个自动换壁纸软件,将女友照骗放进去送给她
  • CMake: 设置编译选项
  • 美团Java开发一面凉经
  • Java面试知识点(全)-spring面试知识点二
  • 【音视频开发】基础知识:视频封装格式和编码格式
  • OData Web API 一个开放标准的协议
  • PT100温度采集
  • ThinkSystem DM 全闪存阵列 —— 通过全闪存 NVMe 转型加速您的业务
  • SpringCloud------代码demo(二)
  • TCL语法
  • Partial convolution Gated convolution
  • 量化投资 无套利 No-arbitrage
  • 小程序容器助力智能移动门户统一
  • opencv-python相机标定详解
  • 由斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名
  • PBDB Data Service:Measurements of specimens(标本测量)
  • 低调的接口工具 ApiKit
  • opengauss 的回归测试
  • 计算机组成原理基础练习题第四章-计算机的运算方法