Guía técnica sobre el ensamblador del compilador Go

Fuentes: Technical guide to the Go compiler's assembler

El ensamblador del compilador Go (gc) opera sobre un conjunto de instrucciones semi-abstracto, no sobre la arquitectura de máquina en bruto, debido a que el compilador realiza la selección de instrucciones después de la generación de código. Esta documentación técnica detalla la sintaxis específica de este ensamblador, que se basa en el estilo de entrada de los ensambladores de Plan 9, pero incorpora diferencias significativas para la interacción con Go.

Un aspecto crítico es que las operaciones específicas de la máquina suelen aparecer como instrucciones en sí, mientras que conceptos generales como la copia de memoria o la llamada a subrutinas son más abstractos. El ensamblador parsea este conjunto de instrucciones semi-abstracto para generar el código que se envía al enlazador. Para visualizar el código generado, los desarrolladores pueden utilizar go tool compile -S o go build -gcflags -S, lo que muestra instrucciones como MOVQ o CALL con direcciones de memoria específicas.

La sintaxis incluye directivas especiales como FUNCDATA y PCDATA, introducidas por el compilador para proporcionar información al recolector de basura. En cuanto a las constantes, el ensamblador Go utiliza la precedencia de operadores de Go y evalúa todos los valores como enteros sin signo de 64 bits, lo que implica que expresiones como -2 se interpretan como el patrón de bits correspondiente al entero unsigned 64, no como el valor numérico negativo. Además, el sistema emplea registros pseudo (FP, PC, SB, SP) para referirse a punteros de marco, contador de programa, base estática y pila, donde los offsets se calculan desde estos registros virtuales para mantener la coherencia entre la arquitectura y las convenciones de Go.