Golang学习函数调用

xxx小M · · 499 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

文件function.go

package compilation

func testFunction(a, aa int64) (int64, int64, int64) {
    var b int64
    var c int64
    return a, b, c
}

编译以后 go tool compile -N -l -S function.go > function.s
文件function.s找到

# size 代表编译成汇编一共59b, 
# args代表传入传出参数大小由调用函数提供
# locals代表这个程度需要多少栈空间
"".testFunction STEXT nosplit size=97 args=0x28 locals=0x18
   0x0000 00000 (function.go:9)   TEXT "".testFunction(SB), NOSPLIT|ABIInternal, $24-40
   # 需要locals空间所以SP-locals, (注意调用函数的时候,栈会push返回点,SP自动减8)
   0x0000 00000 (function.go:9)   SUBQ $24, SP
   0x0004 00004 (function.go:9)   MOVQ BP, 16(SP)
   0x0009 00009 (function.go:9)   LEAQ 16(SP), BP
   0x000e 00014 (function.go:9)   FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
   0x000e 00014 (function.go:9)   FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
   0x000e 00014 (function.go:9)   FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
   0x000e 00014 (function.go:9)   PCDATA $2, $0
   0x000e 00014 (function.go:9)   PCDATA $0, $0
   # ~r2+48(SP), ~r3+56(SP), ~r4+64(SP)三个返回参数都置0
   0x000e 00014 (function.go:9)   MOVQ $0, "".~r2+48(SP)
   0x0017 00023 (function.go:9)   MOVQ $0, "".~r3+56(SP)
   0x0020 00032 (function.go:9)   MOVQ $0, "".~r4+64(SP)
   # b, c三个返回参数都置0
   0x0029 00041 (function.go:10)  MOVQ $0, "".b+8(SP)
   0x0032 00050 (function.go:11)  MOVQ $0, "".c(SP)
   # 这一段赋值给返回参数
   0x003a 00058 (function.go:13)  MOVQ "".a+32(SP), AX
   0x003f 00063 (function.go:13)  MOVQ AX, "".~r2+48(SP)
   0x0044 00068 (function.go:13)  MOVQ "".b+8(SP), AX
   0x0049 00073 (function.go:13)  MOVQ AX, "".~r3+56(SP)
   0x004e 00078 (function.go:13)  MOVQ "".c(SP), AX
   0x0052 00082 (function.go:13)  MOVQ AX, "".~r4+64(SP)
   # 重置BP, SP 的值
   0x0057 00087 (function.go:13)  MOVQ 16(SP), BP
   0x005c 00092 (function.go:13)  ADDQ $24, SP
   # 返回,从SP pop 出返回点~~~~
   0x0060 00096 (function.go:13)  RET
 0x0000 48 83 ec 18 48 89 6c 24 10 48 8d 6c 24 10 48 c7  H...H.l$.H.l$.H.
   0x0010 44 24 30 00 00 00 00 48 c7 44 24 38 00 00 00 00 D$0....H.D$8....
   0x0020 48 c7 44 24 40 00 00 00 00 48 c7 44 24 08 00 00 H.D$@....H.D$...
   0x0030 00 00 48 c7 04 24 00 00 00 00 48 8b 44 24 20 48 ..H..$....H.D$ H
 0x004089 44 24 30 48 8b 44 24 08 48 89 44 24 38 48 8b .D$0H.D$.H.D$8H.
   0x0050 04 24 48 89 44 24 40 48 8b 6c 24 10 48 83 c4 18 .$H.D$@H.l$.H...
   0x0060 c3 .

SP栈结构~~~~

位置变量注释
sp+48r4第三个返回值
sp+48r3第二个返回值
sp+48r2第一个返回值
sp+40aa
sp+32a
sp+24 函数返回点, 调用函数的时候回先
sp+16BP
sp+8b
spc

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:xxx小M

查看原文:Golang学习函数调用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

499 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传