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