2014-09-22 62 views
7

例如:如何在程序集中的結構指針上定義一個函數?

// dummy.go 
type dummy struct { 
    p uintptr 
} 

func (d dummy) Get(i int) uint64 
//func (d *dummy) Get(i int) uint64 //no way to define *dummy in assembly 

func (d dummy) Get可以定義爲:

// dummy_amd64.s 
#include "textflag.h" 
TEXT ·dummy·Get(SB),NOSPLIT,$0 
    MOVQ $42, 24(SP) 
    RET 

我試圖

TEXT "".(*dummy).Get+0(SB),4,$0-24 //output from 6g -S 
TEXT ""·(*dummy)·Get+0(SB),4,$0 
TEXT ·*dummy·Get(SB),NOSPLIT,$0 
//and 
TEXT ·(*dummy)·Get(SB),NOSPLIT,$0 

所有這些給了我同樣的錯誤:

syntax error, last name: "".

我確定我錯過了一些明顯的東西,但我似乎無法弄清楚。

+2

試着用你正在使用的編程語言來定義函數(就我所知,去)並且反彙編目標文件。然後你會看到「真實」的功能名稱。例如,在C++中,「myClass :: myFunc(int,int)」可以在彙編程序中被命名爲_Z7myClassF6myFuncII。 – 2014-09-22 04:30:07

+0

@MartinRosenau不幸的是,複製/粘貼輸出不起作用,我忘了在問題中加入這個。 – OneOfOne 2014-09-22 04:31:40

+0

我發現nada gread stdlib中的'TEXT'子句。值得一個golang堅果後 - 不知道是否有可能。 – twotwotwo 2014-09-22 06:33:05

回答

3

對於當前的工具鏈,這實際上是不可能的。上下文在issue 4978

中解釋,請注意,有a simple patch啓用此功能 - 但只有少數人正在使用它。

您可以編寫一個普通的彙編函數(即不是方法),並在Go方法中實現一個調用,以實現此彙編函數。但額外的調用不會被編譯器優化。

解決這個問題的一個可能的解決方法是實現一些支持,以允許將彙編函數內聯到Go代碼中 - 這將帶來更多好處。我的理解是過去曾經討論過,但還沒有計劃。

+0

這是一個很好的結果,我搜索了幾個小時,我找不到那個問題。 – OneOfOne 2014-09-22 14:30:49

相關問題