golang函数调用的执行逻辑

栏目: Go · 发布时间: 6年前

内容简介:golang中的函数调用底层是靠栈帧实现的,翻看了好多文章发现很少有从最终机器码层面进行解释的,我跟踪发现要比golang汇编复杂一些,具体为什么要有这个命令为啥这么扩容,扩容多少这都是编译器算出来的,我们不需要知道。这篇文章的目的是对函数调用的一个更深层次的认识,当然如果要学好golang中的汇编还需要去看golang汇编相关的知识讲解。从实际开发中需要明白golang汇编就好。以下代码环境:1,Linux version 3.10.0-957.12.2.el7.x86_64

golang中的函数调用底层是靠栈帧实现的,翻看了好多文章发现很少有从最终机器码层面进行解释的,我跟踪发现要比golang汇编复杂一些,具体为什么要有这个命令为啥这么扩容,扩容多少这都是编译器算出来的,我们不需要知道。这篇文章的目的是对函数调用的一个更深层次的认识,当然如果要学好golang中的汇编还需要去看golang汇编相关的知识讲解。从实际开发中需要明白golang汇编就好。

以下代码环境:

1,Linux version 3.10.0-957.12.2.el7.x86_64

2,go version go1.12.5 linux/amd64

以下是我做实验的代码两个数相加的一个函数。

package main
import "fmt"

func main()  {
    d := jia(1,2)
    fmt.Println(d)
}

func jia(a, b int) int {
    c := a + b
    return c
}

然后编译成可执行文件。

go build -gcflags "-N -l" -o run

这里gcflags参数是去掉编译优化,方便调试。

然后用gdb工具进行查看相应的汇编代码,如下:

golang函数调用的执行逻辑

图1

sub rbp,0x70(%rsp) //将rbp的值存入到old rbp处见图2。

lea 0x70(%rsp),%rbp //将old rbp位置的地址存入到rbp作为main的栈底。

movq $0x1, (%rsp) //将函数参数1放入栈中。

movq $0x2, 0x8(%rsp) //将函数参数2放入栈中。

执行完绿框处代码栈的赋值情况见下图2。(其中蓝色的框是第一次扩容的main函数栈空间。绿色的表示调用调用 call jia时候call内部又扩容了8个byte(我猜是函数返回值占8个字节)。粉色是jia函数扩容16个字节。绿色加蓝色的空间是就是jia的栈空间)

golang函数调用的执行逻辑

图2

刚扩容完之后栈中的数据见图3:

golang函数调用的执行逻辑

图3

执行到call jia指令,参数赋值到栈中,栈顶向低地址移动8byte,见下图4:

golang函数调用的执行逻辑

图4

去0x4872d0<main.jia>地址处查看汇编码,见图5:

golang函数调用的执行逻辑

图5

然后执行到图6位置:

golang函数调用的执行逻辑

图6

从图中可以看出将计算结果放到了rax中且赋值到了栈顶处。然后在看一下栈的整体流程图见图7:

golang函数调用的执行逻辑

图7

从图7可以看出函数的参数,返回值都放到了栈中,然后继续执行见下图8:

golang函数调用的执行逻辑

图8

调用完jia(int,int)的retq时,rsp又缩容到初次扩容的地方0xc000032718处,这样栈顶的前3个位置分别为参数和返回值。

在继续执行我发现0xc000032718处的数据依然存在,我猜这些数据不会被删除,如果再用到此空间直接覆盖就好,因为如果用完删除的话会影响性能。

以上就是函数调用的大概流程,直观感受一下就好,但是函数调用如何传参,如何获取返回,大致思路都是一样的都是借助类似栈结构及栈的收缩来实现的。


以上所述就是小编给大家介绍的《golang函数调用的执行逻辑》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cyberwar

Cyberwar

Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96

The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具