Golang学习函数调用

文件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 [email protected]$...
   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 [email protected]$.H...
   0x0060 c3 .

SP栈结构~~~~

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

你可能感兴趣的