SB (Static base pointer):静态基址寄存器,它和全局符号一起表示全局变量的地址
FP(Frame pointer):栈帧寄存器,该寄存器指向当前函数调用栈帧的栈底位置。
PC (Program counter):程序计数器,存放下一条指令的执行地址,很少直接操作该寄存器,一般是CALL、RET 等指令隐式的操作 。
SP (Stack pointer ): 栈顶寄存器,一般在函数调用前由主调函数设置 SP的值对技空间进行分配或回收。
package main
func swap(a,b int)(x,y int){
x = b
y = a
return
}
func main() {
swap(10,20)
}
执行汇编
GOOS=linux GOARCH=amd64 go tool compile -N -l -S swap.go >swap.s 2>&1
0x0000 00000 (swap.go:3) TEXT "".swap(SB), NOSPLIT|ABIInternal, $0-32
0x0000 00000 (swap.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (swap.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (swap.go:3) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (swap.go:3) PCDATA $2, $0
0x0000 00000 (swap.go:3) PCDATA $0, $0
0x0000 00000 (swap.go:3) MOVQ $0, "".x+24(SP)
0x0009 00009 (swap.go:3) MOVQ $0, "".y+32(SP)
0x0012 00018 (swap.go:4) MOVQ "".b+16(SP), AX
0x0017 00023 (swap.go:4) MOVQ AX, "".x+24(SP)
0x001c 00028 (swap.go:5) MOVQ "".a+8(SP), AX
0x0021 00033 (swap.go:5) MOVQ AX, "".y+32(SP)
0x0026 00038 (swap.go:6) RET
0x0000 00000 (swap.go:9) TEXT "".main(SB), ABIInternal, $40-0
0x0000 00000 (swap.go:9) MOVQ (TLS), CX
0x0009 00009 (swap.go:9) CMPQ SP, 16(CX)
0x000d 00013 (swap.go:9) JLS 61
0x000f 00015 (swap.go:9) SUBQ $40, SP
0x0013 00019 (swap.go:9) MOVQ BP, 32(SP)
0x0018 00024 (swap.go:9) LEAQ 32(SP), BP
0x001d 00029 (swap.go:9) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x001d 00029 (swap.go:9) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x001d 00029 (swap.go:9) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x001d 00029 (swap.go:10) PCDATA $2, $0
0x001d 00029 (swap.go:10) PCDATA $0, $0
0x001d 00029 (swap.go:10) MOVQ $10, (SP)
0x0025 00037 (swap.go:10) MOVQ $20, 8(SP)
0x002e 00046 (swap.go:10) CALL "".swap(SB)
0x0033 00051 (swap.go:11) MOVQ 32(SP), BP
0x0038 00056 (swap.go:11) ADDQ $40, SP
0x003c 00060 (swap.go:11) RET
0x003d 00061 (swap.go:11) NOP
0x003d 00061 (swap.go:9) PCDATA $0, $-1
0x003d 00061 (swap.go:9) PCDATA $2, $-1
0x003d 00061 (swap.go:9) CALL runtime.morestack_noctxt(SB)
0x0042 00066 (swap.go:9) JMP 0
参考
https://golang.org/doc/asm
https://www.cnblogs.com/abozhang/p/10766689.html
https://chai2010.cn/advanced-go-programming-book/ch3-asm/readme.html
https://github.com/cch123/asmshare/blob/master/layout.md
https://juejin.im/post/58f579b58d6d81006491c7c0/?utm_source=gold-miner&utm_medium=readme&utm_campaign=github
https://juejin.im/post/58f57be144d904006c09019c
https://www.cnblogs.com/yjf512/p/6132868.html
https://www.jianshu.com/p/09803c6fe179
https://github.com/go-internals-cn/go-internals/blob/master/chapter1_assembly_primer/README.md
https://baixiaoustc.github.io/2019/01/14/2019-01-14-golang-code-inspector-1-all-case/