鍍金池/ 問答/C  C++  GO/ Golang的匯編是什么平臺的匯編?

Golang的匯編是什么平臺的匯編?

Golang構(gòu)建出來的匯編看起來很像AT&T的匯編語言,但是FUNCDATA,JLS這種指令我記得AT&T里面沒有見過啊。

我搜索了一下 https://studygolang.com/artic... 發(fā)現(xiàn)這里提到

Go的匯編語言基于Plan 9的匯編,Plan 9網(wǎng)站的頁面上有詳細(xì)描述。如果你想編寫匯編語言,你應(yīng)該讀這篇文檔,雖然它是Plan
9相關(guān)的。這邊文檔總結(jié)了匯編的語法,并且描述了使用匯編語言和Go程序交互時的特殊之處。

有一點是很重要的是,Go的匯編中沒有直接體現(xiàn)出底層的機器。有些匯編細(xì)節(jié)能直接對應(yīng)到機器,但有些不是。這是因為編譯器套件在常規(guī)過程中不需要匯編語言。取而代之的是,編譯器產(chǎn)生二進(jìn)制的不完整的匯編指令集,鏈接器會完成它。實際上,鏈接器做了匯編指令的選擇,所以當(dāng)你看到類似于MOV這樣的指令,鏈接器的實際操作可能不是一個移動指令,也許是清除或者載入?;蛘呖赡軙鶕?jù)指令的名字對應(yīng)到真實的機器指令??傮w上,機器相關(guān)的指令操作趨向于體現(xiàn)出真實的機器指令,但是一些通用的概念類似于移動內(nèi)存數(shù)據(jù)、調(diào)用子例程、返回等操作就更抽象了。具體的細(xì)節(jié)和架構(gòu)相關(guān),我們?yōu)檫@種不精確性道歉。

匯編程序是生成中間碼的一種方法,未完整定義的指令集作為鏈接器的輸入。
如果你想看到特定CPU架構(gòu)下的匯編指令集,如amd64,在Go標(biāo)準(zhǔn)庫的源文件中就有許多例子,在runtime和math/big包中。

請問一下他為什么不直接編譯成本地平臺的匯編呢?
這和Java的字節(jié)碼,以及JIT之類的技術(shù)有什么關(guān)聯(lián)嗎?

go tool compile -S test.golang

"".main t=1 size=336 value=0 args=0x0 locals=0x98
    0x0000 00000 (test.go:7)    TEXT    "".main(SB), $152-0
    0x0000 00000 (test.go:7)    MOVQ    (TLS), CX
    0x0009 00009 (test.go:7)    LEAQ    -24(SP), AX
    0x000e 00014 (test.go:7)    CMPQ    AX, 16(CX)
    0x0012 00018 (test.go:7)    JLS 320
    0x0018 00024 (test.go:7)    SUBQ    $152, SP
    0x001f 00031 (test.go:7)    FUNCDATA    $0, gclocals·7d2d5fca80364273fb07d5820a76fef4(SB)
    0x001f 00031 (test.go:7)    FUNCDATA    $1, gclocals·6e96661712a005168eba4ed6774db961(SB)
    0x001f 00031 (test.go:8)    LEAQ    type.[1]int(SB), BX
    0x0026 00038 (test.go:8)    MOVQ    BX, (SP)
    0x002a 00042 (test.go:8)    PCDATA  $0, $0
    0x002a 00042 (test.go:8)    CALL    runtime.newobject(SB)
    0x002f 00047 (test.go:8)    MOVQ    8(SP), AX
    0x0034 00052 (test.go:9)    CMPQ    AX, $0
    0x0038 00056 (test.go:9)    JEQ $1, 313
    0x003e 00062 (test.go:9)    MOVQ    $1, DX
    0x0045 00069 (test.go:9)    MOVQ    $1, CX
回答
編輯回答
怣痛

跨平臺方便。新的 arch 只需要寫一個從 plan 9 匯編到 target arch 匯編的轉(zhuǎn)譯器就行了。

2017年10月30日 06:05