SB (Static base pointer):静态基址寄存器,它和全局符号一起表示全局变量的地址
FP(Frame pointer):栈帧寄存器,该寄存器指向当前函数调用栈帧的栈底位置。
PC (Program counter):程序计数器,存放下一条指令的执行地址,很少直接操作该寄存器,一般是CALL、RET 等指令隐式的操作 。
SP (Stack pointer ): 栈顶寄存器,一般在函数调用前由主调函数设置 SP的值对技空间进行分配或回收。

  1. package main
  2. func swap(a,b int)(x,y int){
  3. x = b
  4. y = a
  5. return
  6. }
  7. func main() {
  8. swap(10,20)
  9. }

执行汇编

  1. GOOS=linux GOARCH=amd64 go tool compile -N -l -S swap.go >swap.s 2>&1
  1. 0x0000 00000 (swap.go:3) TEXT "".swap(SB), NOSPLIT|ABIInternal, $0-32
  2. 0x0000 00000 (swap.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
  3. 0x0000 00000 (swap.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
  4. 0x0000 00000 (swap.go:3) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
  5. 0x0000 00000 (swap.go:3) PCDATA $2, $0
  6. 0x0000 00000 (swap.go:3) PCDATA $0, $0
  7. 0x0000 00000 (swap.go:3) MOVQ $0, "".x+24(SP)
  8. 0x0009 00009 (swap.go:3) MOVQ $0, "".y+32(SP)
  9. 0x0012 00018 (swap.go:4) MOVQ "".b+16(SP), AX
  10. 0x0017 00023 (swap.go:4) MOVQ AX, "".x+24(SP)
  11. 0x001c 00028 (swap.go:5) MOVQ "".a+8(SP), AX
  12. 0x0021 00033 (swap.go:5) MOVQ AX, "".y+32(SP)
  13. 0x0026 00038 (swap.go:6) RET
  14. 0x0000 00000 (swap.go:9) TEXT "".main(SB), ABIInternal, $40-0
  15. 0x0000 00000 (swap.go:9) MOVQ (TLS), CX
  16. 0x0009 00009 (swap.go:9) CMPQ SP, 16(CX)
  17. 0x000d 00013 (swap.go:9) JLS 61
  18. 0x000f 00015 (swap.go:9) SUBQ $40, SP
  19. 0x0013 00019 (swap.go:9) MOVQ BP, 32(SP)
  20. 0x0018 00024 (swap.go:9) LEAQ 32(SP), BP
  21. 0x001d 00029 (swap.go:9) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
  22. 0x001d 00029 (swap.go:9) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
  23. 0x001d 00029 (swap.go:9) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
  24. 0x001d 00029 (swap.go:10) PCDATA $2, $0
  25. 0x001d 00029 (swap.go:10) PCDATA $0, $0
  26. 0x001d 00029 (swap.go:10) MOVQ $10, (SP)
  27. 0x0025 00037 (swap.go:10) MOVQ $20, 8(SP)
  28. 0x002e 00046 (swap.go:10) CALL "".swap(SB)
  29. 0x0033 00051 (swap.go:11) MOVQ 32(SP), BP
  30. 0x0038 00056 (swap.go:11) ADDQ $40, SP
  31. 0x003c 00060 (swap.go:11) RET
  32. 0x003d 00061 (swap.go:11) NOP
  33. 0x003d 00061 (swap.go:9) PCDATA $0, $-1
  34. 0x003d 00061 (swap.go:9) PCDATA $2, $-1
  35. 0x003d 00061 (swap.go:9) CALL runtime.morestack_noctxt(SB)
  36. 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/