Espacios de nombres
Variantes
Acciones

Declaración asm

De cppreference.com
< cpp‎ | language
 
 
 
 

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.

Contenido

[editar] Sintaxis

asm ( literal-de-cadena ) ;

[editar] 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.

[editar] 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

[editar] Enlaces externos