得到Go程序的汇编代码的方法-阿里云开发者社区

开发者社区> 技术小能手> 正文

得到Go程序的汇编代码的方法

简介: 有多种方式可以获得Go程序的汇编代码, 尽管输出的格式有些不同,但是都是方便阅读的汇编代码,可以帮助我们更好的了解程序的底层运行方式。 我们看下面一段代码, 它是sync.Once的实现,去掉了不必要的注释,复制出来用来研究的一段小代码: once.
+关注继续查看

有多种方式可以获得Go程序的汇编代码, 尽管输出的格式有些不同,但是都是方便阅读的汇编代码,可以帮助我们更好的了解程序的底层运行方式。

我们看下面一段代码, 它是sync.Once的实现,去掉了不必要的注释,复制出来用来研究的一段小代码:

once.go
 1type Once struct {
 2    m    sync.Mutex
 3    done uint32
 4}
 5func (o *Once) Do(f func()) {
 6    if atomic.LoadUint32(&o.done) == 1 {
 7        return
 8    }
 9    o.m.Lock()
10    defer o.m.Unlock()
11    if o.done == 0 {
12        defer atomic.StoreUint32(&o.done, 1)
13        f()
14    }
15}

方法一: go tool compile
使用go tool compile -N -l -S once.go生成汇编代码:

 1"".(*Once).Do STEXT size=239 args=0x10 locals=0x28
 2    0x0000 00000 (once.go:13)   TEXT    "".(*Once).Do(SB), $40-16
 3    0x0000 00000 (once.go:13)   MOVQ    (TLS), CX
 4    0x0009 00009 (once.go:13)   CMPQ    SP, 16(CX)
 5    0x000d 00013 (once.go:13)   JLS 229
 6    0x0013 00019 (once.go:13)   SUBQ    $40, SP
 7    0x0017 00023 (once.go:13)   MOVQ    BP, 32(SP)
 8    0x001c 00028 (once.go:13)   LEAQ    32(SP), BP
 9    0x0021 00033 (once.go:13)   FUNCDATA    $0, gclocals·fdbf1f5761f6d17e8ae3f0aaecb6a3c5(SB)
10    0x0021 00033 (once.go:13)   FUNCDATA    $1, gclocals·7d2d5fca80364273fb07d5820a76fef4(SB)
11    0x0021 00033 (once.go:13)   FUNCDATA    $3, gclocals·96839595c383af6ae8227769d90a999e(SB)
12    0x0021 00033 (once.go:14)   PCDATA  $2, $1
13    0x0021 00033 (once.go:14)   PCDATA  $0, $0
14    0x0021 00033 (once.go:14)   MOVQ    "".o+48(SP), AX
15    0x0026 00038 (once.go:14)   MOVL    8(AX), CX
16    0x0029 00041 (once.go:14)   CMPL    CX, $1
17    0x002c 00044 (once.go:14)   JEQ 213
18    0x0032 00050 (once.go:18)   PCDATA  $2, $0
19    0x0032 00050 (once.go:18)   MOVQ    AX, (SP)
20    0x0036 00054 (once.go:18)   CALL    sync.(*Mutex).Lock(SB)
21    0x003b 00059 (once.go:19)   PCDATA  $2, $1
22    0x003b 00059 (once.go:19)   MOVQ    "".o+48(SP), AX
23    ……

方法二: go tool objdump
首先先编译程序: go tool compile -N -l once.go,

使用go tool objdump once.o反汇编出代码 (或者使用go tool objdump -s Do once.o反汇编特定的函数:):

 1TEXT %22%22.(*Once).Do(SB) gofile../Users/……/once.go
 2  once.go:13        0x7cd           65488b0c2500000000  MOVQ GS:0, CX           [5:9]R_TLS_LE
 3  once.go:13        0x7d6           483b6110        CMPQ 0x10(CX), SP
 4  once.go:13        0x7da           0f86d2000000        JBE 0x8b2
 5  once.go:13        0x7e0           4883ec28        SUBQ $0x28, SP
 6  once.go:13        0x7e4           48896c2420      MOVQ BP, 0x20(SP)
 7  once.go:13        0x7e9           488d6c2420      LEAQ 0x20(SP), BP
 8  once.go:14        0x7ee           488b442430      MOVQ 0x30(SP), AX
 9  once.go:14        0x7f3           8b4808          MOVL 0x8(AX), CX
10  once.go:14        0x7f6           83f901          CMPL $0x1, CX
11  once.go:14        0x7f9           0f84a3000000        JE 0x8a2
12  once.go:18        0x7ff           48890424        MOVQ AX, 0(SP)
13  once.go:18        0x803           e800000000      CALL 0x808          [1:5]R_CALL:sync.(*Mutex).Lock
14  once.go:19        0x808           488b442430      MOVQ 0x30(SP), AX
15  once.go:19        0x80d           4889442410      MOVQ AX, 0x10(SP)
16  once.go:19        0x812           c7042408000000      MOVL $0x8, 0(SP)
17  ……

方法三: go build -gcflags -S
使用go build -gcflags -S once.go也可以得到汇编代码:

 1"".(*Once).Do STEXT size=239 args=0x10 locals=0x28
 2    0x0000 00000 (/Users/……/once.go:13) TEXT    "".(*Once).Do(SB), $40-16
 3    0x0000 00000 (/Users/……/once.go:13) MOVQ    (TLS), CX
 4    0x0009 00009 (/Users/……/once.go:13) CMPQ    SP, 16(CX)
 5    0x000d 00013 (/Users/……/once.go:13) JLS 229
 6    0x0013 00019 (/Users/……/once.go:13) SUBQ    $40, SP
 7    0x0017 00023 (/Users/……/once.go:13) MOVQ    BP, 32(SP)
 8    0x001c 00028 (/Users/……/once.go:13) LEAQ    32(SP), BP
 9    0x0021 00033 (/Users/……/once.go:13) FUNCDATA    $0, gclocals·fdbf1f5761f6d17e8ae3f0aaecb6a3c5(SB)
10    0x0021 00033 (/Users/……/once.go:13) FUNCDATA    $1, gclocals·7d2d5fca80364273fb07d5820a76fef4(SB)
11    0x0021 00033 (/Users/……/once.go:13) FUNCDATA    $3, gclocals·96839595c383af6ae8227769d90a999e(SB)
12    0x0021 00033 (/Users/……/once.go:14) PCDATA  $2, $1
13    0x0021 00033 (/Users/……/once.go:14) PCDATA  $0, $0
14    0x0021 00033 (/Users/……/once.go:14) MOVQ    "".o+48(SP), AX
15    0x0026 00038 (/Users/……/once.go:14) MOVL    8(AX), CX
16    0x0029 00041 (/Users/……/once.go:14) CMPL    CX, $1
17    0x002c 00044 (/Users/……/once.go:14) JEQ 213

go tool compile 和 go build -gcflags -S 生成的是过程中的汇编,和最终的机器码的汇编可以通过go tool objdump生成。

原文发布时间为:2019-1-1
本文作者:Golang语言社区
本文来自云栖社区合作伙伴“ Golang语言社区”,了解相关信息可以关注“Golangweb”微信公众号

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
25个JavaScript数组方法代码示例
摘要: 通过代码掌握数组方法。 原文:通过实现25个数组方法来理解及高效使用数组方法(长文,建议收藏) 译者:前端小智 Fundebug经授权转载,版权归原作者所有。 要在给定数组上使用方法,只需要通过[].方法名即可,这些方法都定义在 Array.prototype 对象上。
3419 0
DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录
DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录
33 0
DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录(二)
DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录
29 0
AST 代码扫描实战:如何保障代码质量
2020 年 618 大促已经过去,作为淘系每年重要的大促活动,淘系前端在其中扮演着什么样的角色,如何保证大促的平稳进行?又在其中应用了哪些新技术?淘系前端团队特此推出「618 系列|淘系前端技术分享」,为大家介绍 618 中的前端身影。 本篇来自于频道与D2C智能团队的菉竹,为大家介绍本次 618 大促中是如何用代码扫描做资损防控的。
1765 0
一首诗的代码
#include #include #include int one1=1,one2=1,one3=1,one4=1,one5=1,one6=1; void color1() { system("color F4"); Sleep(500); } void...
743 0
05.Java网络编程(代码实践)
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路链接起来,在网络操作系统,网络管理软件及网络通信协议的协调下,实现资源贡献和信息传递的计算机系统 网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换 网...
786 0
xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
掌握了基本技巧后,基本上已不难理解所有的反汇编结果。授之以鱼不如授之以渔: 通过观察自己写的代码的反汇编来掌握各种代码的反汇编结果,从而逆向推测系统代码的源码。
950 0
SSM框架——使用 MyBatis Generator 生成代码,包括:Model、Dao、Mapping
基于 SSM 框架开发,Mybatis 属于半自动 ORM,如果每个数据表相关的 Model、Dao、Mapping 都要自己动手去写,是不是很麻烦呢?工作量最大的就是书写Mapping的映射文件,而且手动书写很容易出错。
1156 0
html实体编码遇上js代码
在js中单、双引号引起来的是字符串,如果我们要在字符串中使用单、双引号,需要反斜杠进行转义。而如果字符串出现在html标签中,我们需要做转义处理。
2488 0
+关注
技术小能手
云栖运营小编~
7208
文章
9
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载