Declaración asm
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.
| Esta sección está incompleta Razón: Escribir una nota sobre la sintaxis de ensamblador extendido de GCC, ya que ahora es compatible con Intel, IBM, Sun (a partir de v12), etc. |
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