Declaración asm - cppreference.com
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: