48 votes

Est-il possible d'inclure le montage dans Google Aller au code?

Est-il possible d'inclure le montage dans Google Aller au code?

47voto

Alexander Points 1851

Il n'y a pas de support pour assembly en ligne, mais vous pouvez lier avec le code écrit dans l'assemblée par l'intermédiaire de C, la compilation avec cgo et à l'aide de import "C", comme dans les bpf.aller. Vous pouvez également écrire dans un style de montage qui est directement compatible avec Aller, comme dans asm_linux_amd64.s, qui exige que les noms de fonctions commencent par "·".

Ou, vous pouvez utiliser des msna et gccgo, ma façon préférée jusqu'à présent. (Notez que les Msna ne semblent pas soutenir les fonctions commençant par "·").

Voici un travail exemple "hello world":

bonjour.asm:

; Based on hello.asm from nasm

    SECTION .data       ; data section
msg:    db "Hello World",10 ; the string to print, 10=cr
len:    equ $-msg       ; "$" means "here"
                ; len is a value, not an address

    SECTION .text       ; code section

global go.main.hello        ; make label available to linker (Go)
go.main.hello:

    ; --- setup stack frame
    push rbp            ; save old base pointer
    mov rbp,rsp   ; use stack pointer as new base pointer

    ; --- print message
    mov edx,len     ; arg3, length of string to print
    mov ecx,msg     ; arg2, pointer to string
    mov ebx,1       ; arg1, where to write, screen
    mov eax,4       ; write sysout command to int 80 hex
    int 0x80        ; interrupt 80 hex, call kernel

    ; --- takedown stack frame
    mov rsp,rbp  ; use base pointer as new stack pointer
    pop rbp      ; get the old base pointer

    ; --- return
    mov rax,0       ; error code 0, normal, no error
    ret         ; return

principal.aller:

package main

func hello();

func main() {
    hello()
    hello()
}

Et une pratique Makefile:

main: main.go hello.o
    gccgo hello.o main.go -o main

hello.o: hello.asm
    nasm -f elf64 -o hello.o hello.asm

clean:
    rm -rf _obj *.o *~ *.6 *.gch a.out main

J'appelle hello() deux fois en main.allez, juste pour vérifier qu'bonjour() renvoie correctement.

Noter que l'appel d'interruption 80h directement n'est pas considéré comme un bon style sur Linux, et en appelant les fonctions écrit est C est plus de "l'avenir". Notez également que c'est l'assemblée spécifiquement pour Linux 64 bits, et n'est pas indépendant de la plateforme, en aucune façon, la forme ou la forme.

Je sais que c'est pas une réponse directe à votre question, mais c'est la voie la plus facile je le sais pour les utiliser assemblée Aller, en l'absence de l'in-lining. Si vous avez vraiment besoin de l'in-lining, il est possible d'écrire un script qui extrait assembly en ligne à partir de fichiers source et les prépare d'une manière qui suit le modèle ci-dessus. Assez proche? :)

Exemple rapide pour Aller, C et Msna: gonasm.tgz

Mise à jour: les versions Ultérieures de gccgo besoins de l'indicateur g et que "les principaux.bonjour" au lieu de "aller.principal.bonjour". Voici une mise à jour de exemple pour Aller, C et Yasm: goyasm.tgz

25voto

peterSO Points 25725

Il n'y a pas d'installation dans la langue de programmation à l'appui en ligne d'assembleur, code de langue, et il n'y a aucune intention de le faire. Aller prend en charge les reliant à des routines écrites en assembleur et C. Il est une fonctionnalité expérimentale qui ajoute RASADE de soutien à l'Aller.

14voto

kristianp Points 1573

Non, vous ne pouvez pas, mais il est facile de fournir une assemblée de mise en œuvre d'une seule fonction à l'aide de l'aller compilateur. Il n'est pas nécessaire d'utiliser "Importer C" à utiliser de l'assemblée.

Jetez un oeil à un exemple tiré de la bibliothèque de mathématiques:

http://golang.org/src/pkg/math/abs.go : La fonction Abs est déclarée dans le fichier aller. (il existe également une mise en œuvre de l'apa en aller dans ce fichier, mais ce n'est pas exportées en tant qu'il a un bas-de-casse nom.

package math

// Abs returns the absolute value of x.
//
// Special cases are:
//  Abs(±Inf) = +Inf
//  Abs(NaN) = NaN
func Abs(x float64) float64

Puis, dans http://golang.org/src/pkg/math/abs_amd64.s Abs est mis en œuvre pour les processeurs intel 64 bits dans ce fichier:

// func Abs(x float64) float64
TEXT ·Abs(SB),NOSPLIT,$0
    MOVQ   $(1<<63), BX
    MOVQ   BX, X0 // movsd $(-0.0), x0
    MOVSD  x+0(FP), X1
    ANDNPD X1, X0
    MOVSD  X0, ret+8(FP)
    RET

12voto

Ton van den Heuvel Points 3222

Il s'avère que cela est possible, voir: http://www.doxsey.net/blog/go-and-assembly.

3voto

Atom Points 8739

L'optimisation passe dans la norme Aller compilateur (qui est: 8g+8l, pas gccgo) est essentiellement travailler avec des instructions sous forme binaire. Il n'y a actuellement aucun moyen (il n'est pas mis en œuvre) pour le compilateur de distinguer généré par le compilateur assemblée fourni par l'utilisateur code d'assembly en ligne - ce est la principale raison pour laquelle le Aller compilateur ne permet pas d'assembly en ligne. En d'autres termes, le compilateur n'a pas de support en ligne de l'assemblée en raison de l'architecture du compilateur.

Il y a de sûr, rien dans la langue elle-même qui serait de prévenir d'autres Vont les implémentations de langue (qui est: autres Aller compilateurs) pour avoir le support assembly en ligne. Assembly en ligne est un compilateur spécifique à la décision - il a peu à faire avec le langage lui-même.

Dans les deux cas, le montage est dangereux car il ne peut pas être vérifiée de justesse par Go type du système. Il semble qu'il est préférable de mettre en œuvre toute fonction qui nécessite l'utilisation de l'assembly en ligne dans un langage comme C, et appeler la fonction C de Go.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X