go编译原理二|Go主题月

588 阅读2分钟

1. 如下图,go在windows下的安装后的目录结构,有一个doc目录,今天就来盘他。

image.png

2.打开目录双击asm.html

image.png

3.在浏览器上展示如下:

image.png 这是关于go汇编的快速指南,篇幅不大,继续往下面看。

3.1 the Plan 9 assemblers

不懂就问,这是什么意思?指的是汇编语言,还是指指令集。后面根据百度了解到是汇编器的意思。

3.2 go为什么选择 the plan 9 汇编器?

这个指南没有介绍,我也不敢问大佬们,只能看看网友们怎么说的, 猜测一: Go team 开始的核心成员就是搞 plan9 那帮人,他们喜欢用自己熟悉的工具链也正常吧。 猜测二: 大佬们为了推广自己的成果。

3.3输入相关命令查看示例程序的汇编代码

go tool compile -S x.go

"".main STEXT size=144 args=0x0 locals=0x58 funcid=0x0
        0x0000 00000 (hello.go:5)       TEXT    "".main(SB), ABIInternal, $88-0
        0x0000 00000 (hello.go:5)       MOVQ    TLS, CX
        0x0009 00009 (hello.go:5)       PCDATA  $0, $-2
        0x0009 00009 (hello.go:5)       MOVQ    (CX)(TLS*2), CX
        0x0010 00016 (hello.go:5)       PCDATA  $0, $-1
        0x0010 00016 (hello.go:5)       CMPQ    SP, 16(CX)
        0x0014 00020 (hello.go:5)       PCDATA  $0, $-2
        0x0014 00020 (hello.go:5)       JLS     134
        0x0016 00022 (hello.go:5)       PCDATA  $0, $-1
        0x0016 00022 (hello.go:5)       SUBQ    $88, SP
        0x001a 00026 (hello.go:5)       MOVQ    BP, 80(SP)
        0x001f 00031 (hello.go:5)       LEAQ    80(SP), BP
        0x0024 00036 (hello.go:5)       FUNCDATA        $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0024 00036 (hello.go:5)       FUNCDATA        $1, gclocals·f207267fbf96a0178e8758c6e3e0ce28(SB)
        0x0024 00036 (hello.go:5)       FUNCDATA        $2, "".main.stkobj(SB)
        0x0024 00036 (hello.go:6)       XORPS   X0, X0
        0x0027 00039 (hello.go:6)       MOVUPS  X0, ""..autotmp_11+64(SP)
        0x002c 00044 (hello.go:6)       LEAQ    type.string(SB), AX
        0x0033 00051 (hello.go:6)       MOVQ    AX, ""..autotmp_11+64(SP)
        0x0038 00056 (hello.go:6)       LEAQ    ""..stmp_0(SB), AX
        0x003f 00063 (hello.go:6)       MOVQ    AX, ""..autotmp_11+72(SP)
        0x0044 00068 (<unknown line number>)    NOP
        0x0044 00068 ($GOROOT\src\fmt\print.go:274)     MOVQ    os.Stdout(SB), AX
        0x004b 00075 ($GOROOT\src\fmt\print.go:274)     LEAQ    go.itab.*os.File,io.Writer(SB), CX
        0x0052 00082 ($GOROOT\src\fmt\print.go:274)     MOVQ    CX, (SP)
        0x0056 00086 ($GOROOT\src\fmt\print.go:274)     MOVQ    AX, 8(SP)
        0x005b 00091 ($GOROOT\src\fmt\print.go:274)     LEAQ    ""..autotmp_11+64(SP), AX
        0x0060 00096 ($GOROOT\src\fmt\print.go:274)     MOVQ    AX, 16(SP)
        0x0065 00101 ($GOROOT\src\fmt\print.go:274)     MOVQ    $1, 24(SP)
        0x006e 00110 ($GOROOT\src\fmt\print.go:274)     MOVQ    $1, 32(SP)
        0x0077 00119 ($GOROOT\src\fmt\print.go:274)     PCDATA  $1, $0
        0x0077 00119 ($GOROOT\src\fmt\print.go:274)     CALL    fmt.Fprintln(SB)
        0x007c 00124 (hello.go:6)       MOVQ    80(SP), BP
        0x0081 00129 (hello.go:6)       ADDQ    $88, SP
        0x0085 00133 (hello.go:6)       RET
        0x0086 00134 (hello.go:6)       NOP
        0x0086 00134 (hello.go:5)       PCDATA  $1, $-1
        0x0086 00134 (hello.go:5)       PCDATA  $0, $-2
        0x0086 00134 (hello.go:5)       CALL    runtime.morestack_noctxt(SB)
        0x008b 00139 (hello.go:5)       PCDATA  $0, $-1
`        0x008b 00139 (hello.go:5)       JMP     0 ...