¿Es posible incluir el ensamblaje en línea en el código Google Go?¿Es posible incluir el ensamblaje en línea en el código Google Go?
Respuesta
No hay soporte para ensamblaje en línea, pero puede vincular con código escrito en ensamble a través de C, compilando con cgo y usando import "C"
, como en gmp.go. Alternativamente, puede escribir en un estilo de ensamblaje que sea directamente compatible con Go, como en asm_linux_amd64.s, que requiere que los nombres de las funciones comiencen con "·".
O bien, puedes usar nasm y gccgo, mi forma favorita hasta ahora. (Tenga en cuenta que Nasm no parece soportar funciones que comiencen con "·").
Aquí hay un trabajo "hola mundo" ejemplo:
hello.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
main.go:
package main
func hello();
func main() {
hello()
hello()
}
Y un Makefile útil:
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
Llamo al hello()
dos veces en main.go, solo para verificar que hello() regrese correctamente.
Tenga en cuenta que llamar a la interrupción 80h directamente no se considera un buen estilo en Linux, y llamar a las funciones escritas es C es más "a prueba de futuro". También tenga en cuenta que este es un ensamblaje específico para Linux de 64 bits, y no es independiente de la plataforma de ninguna manera, forma o forma.
Sé que no es una respuesta directa a su pregunta, pero es la ruta más fácil que conozco para utilizar el ensamblaje con Go, en ausencia de alineación. Si realmente necesita alineación, es posible escribir un script que extraiga el ensamblaje en línea de los archivos fuente y lo prepare de una manera que siga el patrón anterior. ¿Suficientemente cerca? :)
ejemplorápida para Go, C y Nasm: gonasm.tgz
Actualización: Las versiones posteriores de gccgo necesita que la -g y sólo "main.hello" se necesita en lugar de "go.main.hello ". Aquí hay un ejemplo actualizado para Go, C y Yasm: goyasm.tgz
No hay ninguna función en el lenguaje de programación Go para admitir el código del lenguaje del ensamblador en línea, y no hay planes para hacerlo. Go admite enlaces a rutinas escritas en assembler y C. Hay una función experimental que agrega SWIG support a Go.
El pase de optimización en el compilador Go estándar (es decir, 8g + 8l, no gccgo) está trabajando básicamente con instrucciones sin formato en formato binario. Actualmente no hay forma (no está implementado) para que el compilador distinga el ensamblado generado por el compilador del código ensamblado en línea suministrado por el usuario - este es la razón principal por la cual el compilador Go no permite el ensamblaje en línea. En otras palabras, el compilador no admite el ensamblaje en línea debido a la arquitectura del compilador .
Por supuesto, no hay nada en el idioma Go que impida que otras implementaciones de Go language (es decir, otros compiladores Go) tengan soporte para el ensamblado en línea. El ensamblaje en línea es una decisión específica del compilador; tiene poco que ver con el idioma Go en sí.
En cualquier caso, el ensamblaje en línea no es seguro porque el sistema de tipos de Go no lo puede verificar. Parece que es mejor implementar cualquier función que requiera el uso del ensamblaje en línea en un lenguaje como C, y llamar a la función C desde Go.
Es mejor no usar asm en línea en absoluto, la versión original de C y Unix no lo necesitaba o implementarlo, hace que el código sea inportable y – uriel
Como resulta que esto es posible, ver: http://www.doxsey.net/blog/go-and-assembly.
Eso es no * ensamblado * en línea, sin embargo. – Alexander
No, no puede, pero es fácil proporcionar una implementación de conjunto de una sola función mediante el uso del compilador go. No es necesario usar "Importar C" para usar el ensamblaje.
Tome un vistazo a un ejemplo de la biblioteca matemática:
http://golang.org/src/pkg/math/abs.go: La función ABS se declara en este archivo ir. (También hay una implementación de ABS en marcha en este archivo, pero esto no se exporta, ya que tiene un nombre en minúscula.)
package math
// Abs returns the absolute value of x.
//
// Special cases are:
// Abs(±Inf) = +Inf
// Abs(NaN) = NaN
func Abs(x float64) float64
Luego, en http://golang.org/src/pkg/math/abs_amd64.s, Abs se implementa para Intel de 64 bits en este archivo:
// 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
- 1. ¿Es posible guardar un ensamblaje dinámico en el disco?
- 2. ¿Es posible escribir código de ensamblaje en vb.net o C#?
- 3. ¿Es posible incluir/importar código al Manifiesto de Android?
- 4. ¿Qué es esto de "foo. (Bar.Baz)" en el código Go?
- 5. ¿Es posible realizar una interrupción personalizada en el ensamblaje?
- 6. ¿Cómo puedo incluir pruebas unitarias en el ensamblaje de maven?
- 7. ¿El código es más rápido que el código en línea?
- 8. ¿Es posible incluir JButton en una JTable?
- 9. ¿Es posible incluir múltiples módulos en una sola declaración "incluir"?
- 10. ¿Cuál es el problema con mi código de ensamblaje
- 11. ¿Es posible simbolizar el código C++?
- 12. ¿Es posible mezclar el código C89 con el código C99?
- 13. Etiquetas en ensamblaje en línea de GCC
- 14. GCC C++ y código de ensamblaje en línea?
- 15. ¿Es posible ver el historial de una línea en SVN?
- 16. Linux 64 parámetros de línea de comando en el ensamblaje
- 17. ¿Es posible implementar el completado de código Python en TextMate?
- 18. ¿Es posible imitar la interfaz Go en C/C++?
- 19. nueva línea en ensamblaje 8086
- 20. ¿es posible incluir php en html en IIS7?
- 21. ¿Cómo se marca el código como obsoleto en Go?
- 22. ¿Dónde rspec prueba el código en lib/go?
- 23. Es posible usar el código lua en Unity3D
- 24. ¿Es posible configurar ELMAH por completo en el código?
- 25. ¿Es posible ocultar una contraseña definida en el código C++
- 26. Descifrando y comprendiendo el código de ensamblaje
- 27. Código de ensamblaje en C++
- 28. Traducir ensamblaje en línea para admitir x64
- 29. Posible incluir Mono Runtimes en el paquete OSX .app?
- 30. Cómo encontrar un método en el código de ensamblaje
+1 en un vínculo de referencia podría hacer que esta respuesta perfecta;) – OscarRyz
@OscarReyes: Hecho – peterSO
1 Ahora bien, es perfecto! :) – OscarRyz