golang 反汇编的命令

main.go内容如下:

package main

import (
	"fmt"
)

func main() {
	fmt.Println("zzzzzzzzzzz")
}

可以使用以下的命令反汇编出来plan 9汇编指令的内容:

#以下两种命令都可以
go tool compile -S main.go


go build -gcflags -S main.go

windows平台与linux平台反汇编出来的汇编指令内容是一致的:

下面是windows系统的内容:

go tool compile -S main.go
"".main STEXT size=144 args=0x0 locals=0x58 funcid=0x0
        0x0000 00000 (main.go:7)        TEXT    "".main(SB), ABIInternal, $88-0
        0x0000 00000 (main.go:7)        MOVQ    TLS, CX
        0x0009 00009 (main.go:7)        PCDATA  $0, $-2
        0x0009 00009 (main.go:7)        MOVQ    (CX)(TLS*2), CX
        0x0010 00016 (main.go:7)        PCDATA  $0, $-1
        0x0010 00016 (main.go:7)        CMPQ    SP, 16(CX)
        0x0014 00020 (main.go:7)        PCDATA  $0, $-2
        0x0014 00020 (main.go:7)        JLS     134
        0x0016 00022 (main.go:7)        PCDATA  $0, $-1
        0x0016 00022 (main.go:7)        SUBQ    $88, SP
        0x001a 00026 (main.go:7)        MOVQ    BP, 80(SP)
        0x001f 00031 (main.go:7)        LEAQ    80(SP), BP
        0x0024 00036 (main.go:7)        FUNCDATA        $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0024 00036 (main.go:7)        FUNCDATA        $1, gclocals·f207267fbf96a0178e8758c6e3e0ce28(SB)
        0x0024 00036 (main.go:7)        FUNCDATA        $2, "".main.stkobj(SB)
        0x0024 00036 (main.go:8)        XORPS   X0, X0
        0x0027 00039 (main.go:8)        MOVUPS  X0, ""..autotmp_11+64(SP)
        0x002c 00044 (main.go:8)        LEAQ    type.string(SB), AX
        0x0033 00051 (main.go:8)        MOVQ    AX, ""..autotmp_11+64(SP)
        0x0038 00056 (main.go:8)        LEAQ    ""..stmp_0(SB), AX
        0x003f 00063 (main.go:8)        MOVQ    AX, ""..autotmp_11+72(SP)
        0x0044 00068 (<unknown line number>)    NOP

下面是linux系统的内容:

[root@localhost golang]# go tool compile -S main.go
"".main STEXT size=138 args=0x0 locals=0x58 funcid=0x0
        0x0000 00000 (main.go:9)        TEXT    "".main(SB), ABIInternal, $88-0
        0x0000 00000 (main.go:9)        MOVQ    (TLS), CX
        0x0009 00009 (main.go:9)        CMPQ    SP, 16(CX)
        0x000d 00013 (main.go:9)        PCDATA  $0, $-2
        0x000d 00013 (main.go:9)        JLS     128
        0x000f 00015 (main.go:9)        PCDATA  $0, $-1
        0x000f 00015 (main.go:9)        SUBQ    $88, SP
        0x0013 00019 (main.go:9)        MOVQ    BP, 80(SP)
        0x0018 00024 (main.go:9)        LEAQ    80(SP), BP
        0x001d 00029 (main.go:9)        FUNCDATA        $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x001d 00029 (main.go:9)        FUNCDATA        $1, gclocals·f207267fbf96a0178e8758c6e3e0ce28(SB)
        0x001d 00029 (main.go:9)        FUNCDATA        $2, "".main.stkobj(SB)
        0x001d 00029 (main.go:10)       XORPS   X0, X0
        0x0020 00032 (main.go:10)       MOVUPS  X0, ""..autotmp_11+64(SP)
        0x0025 00037 (main.go:10)       LEAQ    type.string(SB), AX
        0x002c 00044 (main.go:10)       MOVQ    AX, ""..autotmp_11+64(SP)
        0x0031 00049 (main.go:10)       LEAQ    ""..stmp_0(SB), AX
        0x0038 00056 (main.go:10)       MOVQ    AX, ""..autotmp_11+72(SP)
        0x003d 00061 (<unknown line number>)    NOP

有这个神器以后性能优化就更方便了。

上一篇:在C语言中实现协程库(一)----------协程切换原理详解


下一篇:【汇编语言与计算机系统结构笔记09】程序栈,(x86-32)过程调用,栈帧,寄存器使用惯例