Espacios de nombres
Variantes

Declaración asm

De cppreference.com
 
 
 
 

La declaración asm brinda la capacidad de incrustar código fuente en lenguaje ensamblador dentro de un programa de C++. Esta declaración es condicionalmente compatible y su implementación está definida, lo que significa que puede no estar presente e, incluso cuando lo proporciona la implementación, no tiene un significado fijo.

Sintaxis

asm ( literal-de-cadena ) ;

Explicación

El literal-de-cadena es típicamente un programa corto escrito en lenguaje ensamblador, que se ejecuta cada vez que se ejecuta esta declaración. Los diferentes compiladores de C++ tienen reglas muy diferentes para las declaraciones asm y diferentes convenciones para la interacción con el código de C++ circundante.

Como otras declaraciones de bloque, esta declaración puede aparecer dentro de un bloque (un cuerpo de función u otra declaración compuesta), y, como todas las demás declaraciones, esta declaración también puede aparecer fuera de un bloque.

Ejemplos

Demuestra dos tipos de sintaxis de ensamblador en línea que ofrece el compilador GCC. Este programa solo funcionará correctamente en la plataforma x86_64 en Linux.

#include <iostream>

extern "C" int func();
// la definición de func está escrita en lenguaje ensamblador
// literal de cadena sin formato podría ser muy útil
asm(R"(
.globl func
    .type func, @function
    func:
    .cfi_startproc
    movl $7, %eax
    ret
    .cfi_endproc
)");

int main()
{
    int n = func();
    // ensamblador extendido en línea
    asm ("leal (%0,%0,4),%0"
         : "=r" (n)
         : "0" (n));
    std::cout << "7*5 = " << n << std::endl; // la descarga es intencional

    // ensamblador estándar en línea
    asm ("movq $60, %rax\n\t" // el número de salida de syscall en Linux
         "movq $2,  %rdi\n\t" // este programa devuelve 2
         "syscall");
}

Salida:

7*5 = 35

Enlaces externos