golang 函数调用栈笔记

news2024/11/22 11:00:20

 

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

  • 返回地址(函数执行结束后,会跳转到这个地址执行)
  •  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.coloradmin.cn/o/535673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook广告投放过程中,如何提高有效曝光?

在数字营销中,广告曝光是至关重要的一环,Facebook广告投放也不例外。 有效曝光能够提高广告的点击率和转化率,从而帮助企业实现更好的广告效果。那么在Facebook广告投放过程中,如何提高有效曝光呢?下面将为大家分享几…

【Mybatis】SpringBoot整合Mybatis

唠嗑部分 之前我们说了Mybatis的一些文章,相关文章: 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 【Mybatis】Mybatis处理一对多、多对多关系映射-四 这篇文章我们来说说SpringBoot如…

前端面试高频题精讲(一)

HTML篇 什么是语义化 用正确的标签做正确的事情。例如:段落用 p 标签,标题用 h 系列标签。 便于团队的开发和维护,我见过用div走天下的,但不利于看清页面结构。在没有加载 CSS 的情况下也能呈现较好的内容结构与代码结构&#xf…

Ubuntu18.04/20.04/22.04的Apollo8.0软件包安装(免编译)

本文主要介绍在如何使用软件包(即 deb 包)的方式来安装 Apollo,相对于源码方式安装,软件包安装方式不需要编译,更加快捷。但是对环境的支持比较单一,如果在自定义环境内安装,请移步源码安装方式…

camunda流程引擎connector如何使用

在 Camunda 中,Connector 是一种用于与外部系统或服务交互的机制。它允许 BPMN 模型中的 Service Task 节点与外部系统或服务进行通信,从而使流程更加灵活和可扩展。使用 Connector,可以将业务流程与外部系统集成在一起,而无需编写…

java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 搜索体验小程序:海哇 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家…

Python学习27:存款买房(A)

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 你刚刚大学毕业,…

亚马逊如何提高商品listing转化率?测评自养号优势和技巧有哪些?

之前有讲过,亚马逊店铺流量的几大入口,如何获取流量。那么获取了流量之后,亚马逊卖家就需要考虑到转化率的问题,如果流量来没有转化率,一样不会产生订单。如果转化率太低还会影响到商品的表现,比如排名会下…

亚马逊云科技基础设施为大型模型推理提供技术保障

在2019年的亚马逊云科技re:Invent上,亚马逊云科技发布了新的基础设施Inferentia芯片和Inf1实例。Inferentia是一种高性能机器学习推理芯片,由亚马逊云科技定制设计,其目的是提供具有成本效益的大规模低延迟预测。时隔四年,2023年4…

使用particles动态粒子效果,优化登录页

前言 书接上回,咱不是做了落日余晖登录页,说白了就是一个背景图,感觉需要进一步优化一下,做一个高大上的效果。所图所示,我想要背后的动态粒子效果,这就开搞,基于老的代码:vue2和el…

10种最常用的3D 分析工具【GIS】

3D 分析一直是 GIS 中的一个增长趋势,因为它可以更好地表示现实世界。 这不仅仅是为了一张漂亮的图片。 对于某些类型的问题,3D 分析有时是你解决问题的唯一方法。 推动这一需求的 3D 数据类型也呈爆炸式增长。 例如,激光雷达、BIM、无人机…

S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应)

S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应) 前面和大家介绍了MODBUS TCP的基本使用方法,具体可参考以下链接中的内容: S7-200SMART实现MODBUS TCP通信(客户端+服务器)的具体方法和步骤示例 本次继续和大家分享S7-200SMART 中实现MODBUS TCP通…

界面控件DevExtreme使用指南 - 如何为雷达图添加注释?

在之前的版本中,官方技术团队为DevExtreme图表引入了注释支持。在v20.1版本中,继续扩展了对Polar Chart(雷达图)注释的支持,现在可以根据需要应用文本、图像或自定义注释。创建注释后,可以将其附加到Polar …

【Git基础】Gitlab的使用

文章目录 1. 搭建Gitlab1.1 Gitlab介绍1.2 搭建Gitlab 2. Gitlab的权限管理2.1 用户注册2.2 创建用户组2.3 为用户组添加用户2.4 为工程添加访问权限 3. Gitlab的code review4. 团队知识管理4.1 是什么4.2 为什么4.3 怎么做 1. 搭建Gitlab 1.1 Gitlab介绍 GitLab是一个基于Ru…

Kylin-Server-10-SP2-x86_64安装HDP2.7.5.0、Ambari【已解决】

Kylin-Server-10-SP2-x86_64安装HDPAmbari【已解决】 报错赏析解决方案os_check.py主要是三个修改点 参考: 报错赏析 ERROR: Unexpected error Ambari repo file path not set for current OS. ERROR: Exiting with exit code 1. REASON: Failed to create user. E…

anji-plus / AJ-Captcha行为验证码前后端实现

一,简介及源码、文档地址 AJ-Captcha行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式。后端提供Java实现,前端提供了php、angular、html、vue、uni-app、flutter、android、ios等代码示例。 行为验证码采用嵌…

【软考数据库】第十三章 云计算与大数据处理

目录 13.1 云计算 13.1.1 云计算的关键特征 13.1.2 云计算分类 13.1.3 云关键技术 13.1.4 云计算的安全 13.1.5 云安全实施的步骤 13.2 大数据 前言: 笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到&#xff0c…

天线学习笔记——波导中微波模式的理解(TE/TM/TEM)

三种模式的解释 TE/TM/TEM中的“T”是指Transverse的缩写,本意是“横向”,在微波模式中指的是“与传输方向相垂直的方向”,比如说:在三维笛卡尔直角坐标系中波导中的电磁波传输方向是沿着z轴,则把x方向和y方向称为横向…

【8086汇编】用DS和[address]实现字的传送

CPU从内存中读取一个数据单元的数据(1个字节8位),或者读取一个字的数据(2个字节16位) DOSBox实操代码验证

低代码应用开发:告别繁琐,实现高效创新

随着企业数字化转型的不断推进,对于软件开发速度、效率和成本的要求也在不断提高。与此同时,随着技术发展,低代码技术逐渐成为了企业快速实现数字化转型的利器。如今,低代码已经广泛应用于各行各业,帮助企业提高应用开…