Central Docs
Catálogo Inicio

Ensamblador preparado

Índice

@assembler declara una frontera insegura y #prep assembler guarda el ensamblador crudo para que Clang lo valide antes de enlazarlo.

@assembler
func zero() int32:
    #prep assembler "gas-intel"
        xor eax, eax
    #end
    return asm

Los únicos dialectos aceptados son gas-intel y att:

@assembler
func zero_att() int32:
    #prep assembler "att"
        xorl %eax, %eax
    #end
    return asm

gas-intel usa sintaxis Intel de GAS/LLVM, no NASM. Los alias intel, intel-gas, gas_intel, at&t y att_syntax fueron retirados.

Los parámetros pueden interpolarse con {nombre}. En Windows x64, los cuatro primeros argumentos enteros usan RCX, RDX, R8 y R9; el backend escoge el alias de ancho según el tipo.

@assembler
func equal(left: int32, right: int32) int32:
    #prep assembler "gas-intel"
        cmp {left}, {right}
        jne different
        mov eax, 1
        different:
        xor eax, eax
    #end
    return asm

Un bloque de módulo no usa return asm:

#prep assembler module "gas-intel"
    .section .rodata,"a"
    answer:
        .long 42
#end

Los diagnósticos relacionan el archivo generado con la línea .bg mediante core/compiler/prep.py y core/backend/llvm/module.py.