文件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+48 | r4 | 第三个返回值 |
sp+48 | r3 | 第二个返回值 |
sp+48 | r2 | 第一个返回值 |
sp+40 | aa | |
sp+32 | a | |
sp+24 | 函数返回点, 调用函数的时候回先 | |
sp+16 | BP | |
sp+8 | b | |
sp | c |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。