Ist es möglich, inline-Montage in der Go-code?
Ist es möglich, inline-Montage in der Go-code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich, inline-Montage in der Go-code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Unterstützung für inline Assembler, aber Sie können eine Verknüpfung mit code geschrieben in Assembler über C, kompilieren mit cgo und mit
import "C"
wie in gmp.gehen. Könnte man alternativ schreiben, in einem Stil, der Montage, der direkt kompatibel mit Gehen, wie in asm_linux_amd64.s, das erfordert, dass Funktionsnamen beginnen mit "·".Oder Sie verwenden können, nasm und gccgo, mein Favorit so weit. (Beachten Sie, dass Nasm nicht scheinen, um support-Funktionen beginnen mit "·").
Hier ist ein funktionierendes "hello world" - Beispiel:
Hallo.asm:
main.go:
Sowie ein praktisches Makefile:
Nenne ich
hello()
zweimal in main.gehen, nur um zu überprüfen, dass hello() gibt richtig.Beachten Sie, dass der Aufruf der interrupt 80h direkt ist nicht als guter Stil auf Linux, und den Aufruf von Funktionen, geschrieben C ist mehr "zukunftssicher". Beachten Sie auch, dass diese Montage ist speziell für 64-bit-Linux, und ist nicht Plattform-unabhängig in irgendeiner Weise, Form oder form.
Ich weiß, es ist nicht eine direkte Antwort auf deine Frage, aber es ist der einfachste Weg, ich weiß, für die Verwendung der Montage mit zu Gehen, fehlende inlining. Wenn Sie wirklich brauchen, inlining, ist es möglich, ein Skript zu schreiben, dass Extrakte inline Assembler aus Quellcode-Dateien und bereitet Sie in einer Weise, die dem Muster folgt vor. Nah genug? 🙂
Kurzes Beispiel für Go, C und Nasm: gonasm.tgz
Update: Späteren Versionen von gccgo muss die -g-flag und nur "main".hello" wird benötigt, statt "gehen.main.Hallo". Hier ist ein Aktuelles Beispiel für die Go -, C-und Yasm: goyasm.tgz
Gibt es keine Möglichkeit, in der Programmiersprache, die zur Unterstützung von in-line assembler-code, und es gibt keine Pläne, dies zu tun. Gehen unterstützt die Verknüpfung von Routinen, geschrieben in assembler und C. Es ist eine experimentelle Funktion, die fügt SWIG unterstützt zu Gehen.
Als sich herausstellt ist dies möglich, siehe: http://www.doxsey.net/blog/go-and-assembly.
Nein, Sie kann es nicht, aber es ist einfach eine assembly, die Umsetzung von nur einer Funktion, mit der go-compiler. Es gibt keine Notwendigkeit, verwenden Sie "Import C" zu verwenden Montage.
Werfen Sie einen Blick auf ein Beispiel aus der Mathematik-Bibliothek:
http://golang.org/src/pkg/math/abs.go : Die Abs-Funktion deklariert ist, die in dieser go-Datei. (Es gibt auch eine Umsetzung von abs in gehen in dieser Datei, dies ist jedoch nicht exportiert, da es ein lower-case-name.)
Dann, in http://golang.org/src/pkg/math/abs_amd64.s , Abs implementiert ist, für die intel 64-bit-in dieser Datei:
Optimierung-pass in der standard-Gehen-compiler (das ist: 8g+8l, nicht gccgo) ist im Grunde die Arbeit mit raw-Anweisungen in binärer form. Es gibt derzeit keine Möglichkeit (es ist nicht implementiert) für den compiler zu unterscheiden, die vom compiler generierte assembly vom Benutzer gelieferten inline-Assembler-code - diese ist der primäre Grund, warum der Go-compiler nicht erlaubt, die inline-Montage. In anderen Worten, der compiler hat keine Unterstützung für die inline-Montage, denn der compiler Architektur.
Es ist natürlich nichts in der Sprache selbst, die würde verhindern, dass andere Gehen-Sprache-Implementierungen (d.h.: andere Go-Compiler), um die Unterstützung für inline-Montage. Inline Assembler ist ein compiler-spezifische Entscheidung - es hat wenig zu tun mit dem Wechseln der Sprache selbst.
In jedem Fall, inline-Montage ist unsicher, da es nicht auf Richtigkeit überprüft werden, die von Go Typ-system. Es scheint, dass es besser ist, zu implementieren Funktion, die erfordert die Verwendung von inline Assembler in einer Sprache wie C, und rufen Sie die C-Funktion aus Gehen.