最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang二進(jìn)制反匯編問題

 更新時(shí)間:2023年11月22日 17:11:10   作者:風(fēng)神韻  
這篇文章主要介紹了Golang二進(jìn)制反匯編問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Golang二進(jìn)制反匯編

Go的源碼是Plan 9匯編與Go語言的混合使用,即有匯編調(diào)用Go,也有Go調(diào)用匯編。

在很多情況下,直接看匯編代碼更直觀,特別是在研究編譯器生成的函數(shù)實(shí)現(xiàn)時(shí)更有用。

下面介紹兩種反匯編方法:

假設(shè)有個(gè)helloworld.go程序,源碼如下:

package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}

先將代碼編譯成二進(jìn)制,命令如下:

go build --gcflags="-l -N" -o helloworld

會生成一個(gè)helloworld的二進(jìn)制,--gcflags="-l -N"參數(shù)的作用是去掉編譯器優(yōu)化,使生成的匯編代碼與編寫的代碼更相近,同時(shí)也方便GDB調(diào)試。

反匯編成AT&T匯編

AT&T是Linux操作系統(tǒng)最常用的匯編語言,Linux系統(tǒng)提供的objdump工具也是將二進(jìn)制反編譯成AT&T匯編,命令如下:

objdump -d helloworld > att.asm

最終反匯編的結(jié)果放在了att.asm文件。

下面是匯編結(jié)果(截取了部分代碼):

0000000000487200 <main.main>:
  487200:   64 48 8b 0c 25 f8 ff    mov    %fs:0xfffffffffffffff8,%rcx
  487207:   ff ff  
  487209:   48 3b 61 10             cmp    0x10(%rcx),%rsp
  48720d:   76 7a                   jbe    487289 <main.main+0x89>
  48720f:   48 83 ec 68             sub    $0x68,%rsp
  487213:   48 89 6c 24 60          mov    %rbp,0x60(%rsp)
  487218:   48 8d 6c 24 60          lea    0x60(%rsp),%rbp
  48721d:   0f 57 c0                xorps  %xmm0,%xmm0
  487220:   0f 11 44 24 38          movups %xmm0,0x38(%rsp)
  487225:   48 8d 44 24 38          lea    0x38(%rsp),%rax
  ...

反匯編成Plan 9匯編

Plan 9目前看到的只有Go語言在用,而且網(wǎng)上的資料很匱乏,學(xué)習(xí)成本挺高的,但如果學(xué)會了Plan 9匯編,再看Go源碼會非常簡單,而且可以通過Go調(diào)用匯編寫出高效率代碼。

要把二進(jìn)制反匯編成Plan 9匯編,也只能用Go提供的工具,命令如下:

go tool objdump -S helloworld > plan9.asm

最終反匯編的結(jié)果放在了plan9.asm文件。

下面是匯編結(jié)果(截取了部分代碼):

TEXT main.main(SB) /root/program/golang/helloworld/helloworld.go
func main() {
  0x487200      64488b0c25f8ffffff  MOVQ FS:0xfffffff8, CX  
  0x487209      483b6110        CMPQ 0x10(CX), SP   
  0x48720d      767a            JBE 0x487289       
  0x48720f      4883ec68        SUBQ $0x68, SP      
  0x487213      48896c2460      MOVQ BP, 0x60(SP)   
  0x487218      488d6c2460      LEAQ 0x60(SP), BP   
    fmt.Println("Hello, World!")
  0x48721d      0f57c0          XORPS X0, X0       
  0x487220      0f11442438      MOVUPS X0, 0x38(SP)     
  0x487225      488d442438      LEAQ 0x38(SP), AX       
  0x48722a      4889442430      MOVQ AX, 0x30(SP)

建議

從上面展示的結(jié)果來看,兩種匯編還是有點(diǎn)差別的。

在學(xué)習(xí)Go源碼時(shí),選擇用哪種匯編去看這個(gè)要根據(jù)自已的實(shí)際情況來。

我的建議先必須對AT&T匯編有一定了解,因?yàn)镻lan 9匯編資料實(shí)在是太少了,甚至沒有一個(gè)對命令的完整介紹,一個(gè)沒有匯編基礎(chǔ)的人直接看Plan 9的一些文檔,絕對會一臉絕望。

在整理網(wǎng)上一些Plan 9匯編資料時(shí),發(fā)現(xiàn)都是講的Plan 9與AT&T的差異,所以只有了解AT&T,才能進(jìn)一步學(xué)好Plan 9匯編。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Golang內(nèi)存逃逸

    淺談Golang內(nèi)存逃逸

    本文主要介紹了Golang內(nèi)存逃逸,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang中json和jsoniter的區(qū)別使用示例

    Golang中json和jsoniter的區(qū)別使用示例

    這篇文章主要介紹了Golang中json和jsoniter的區(qū)別使用示例,本文給大家分享兩種區(qū)別,結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • 分享6個(gè)Go處理字符串的技巧小結(jié)

    分享6個(gè)Go處理字符串的技巧小結(jié)

    這篇文章主要介紹了分享6個(gè)Go處理字符串的技巧小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Golang實(shí)現(xiàn)Trie(前綴樹)的示例

    Golang實(shí)現(xiàn)Trie(前綴樹)的示例

    本文主要介紹了Golang實(shí)現(xiàn)Trie(前綴樹)的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • go語言中的Stringer的使用示例詳解

    go語言中的Stringer的使用示例詳解

    Go 語言中的 Stringer 是一個(gè)非常有用的接口,它在標(biāo)準(zhǔn)庫的 fmt 包中定義,Stringer 接口允許類型定義它們的字符串表示方式,這在格式化輸出時(shí)特別有用,這篇文章主要介紹了go語言中的Stringer的使用,需要的朋友可以參考下
    2025-02-02
  • Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng)

    Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng)

    本文主要介紹了Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang?WaitGroup?底層原理及源碼解析

    Golang?WaitGroup?底層原理及源碼解析

    WaitGroup?是?Golang?中最常見的并發(fā)控制技術(shù)之一,它的作用我們可以簡單類比為其他語言中多線程并發(fā)控制中的?join(),這篇文章主要介紹了Golang?WaitGroup?底層原理及源碼詳解,需要的朋友可以參考下
    2023-04-04
  • go開發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警

    go開發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警

    本文主要介紹了go開發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警,通過自己的url實(shí)現(xiàn)alertmanager的釘釘報(bào)警,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 深度剖析golang中的sync包

    深度剖析golang中的sync包

    go語言的sync包提供了多種并發(fā)控制工具,如Mutex、RWMutex、WaitGroup、Once、Cond和Map等,用于保護(hù)共享資源和協(xié)調(diào)多個(gè)goroutine的執(zhí)行,這些工具的原理和使用方法在文中都有詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • golang語言編碼規(guī)范的實(shí)現(xiàn)

    golang語言編碼規(guī)范的實(shí)現(xiàn)

    這篇文章主要介紹了golang語言編碼規(guī)范的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論

隆回县| 波密县| 汤阴县| 泽普县| 平谷区| 卓资县| 白沙| 长治县| 息烽县| 林芝县| 涟源市| 安徽省| 楚雄市| 岚皋县| 新泰市| 竹山县| 皮山县| 来安县| 武汉市| 民乐县| 阜康市| 顺平县| 菏泽市| 金川县| 扬中市| 朝阳县| 克什克腾旗| 元阳县| 西华县| 东辽县| 革吉县| 蓝山县| 邹城市| 普格县| 元朗区| 西华县| 莱阳市| 南和县| 萝北县| 辽中县| 抚顺县|