Namespaces
Variants

Inline assembly

From cppreference.net

El ensamblado en línea (normalmente introducido por la palabra clave asm ) proporciona la capacidad de incrustar código fuente en lenguaje ensamblador dentro de un programa en C.

A diferencia de C++, el ensamblado en línea se trata como una extensión en C. Es soportado condicionalmente y definido por la implementación, lo que significa que puede no estar presente y, incluso cuando lo proporciona la implementación, no tiene un significado fijo.

Contenidos

Sintaxis

asm ( string_literal ) ;

Explicación

Este tipo de sintaxis de ensamblador en línea es aceptada por el estándar de C++ y se denomina asm-declaration en C++. El string_literal es típicamente un programa corto escrito en lenguaje ensamblador, que se ejecuta cada vez que esta declaración es ejecutada. Diferentes compiladores de C tienen reglas enormemente variables para las asm-declarations, y diferentes convenciones para la interacción con el código C circundante.

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

Notas

MSVC no admite el ensamblado en línea en los procesadores ARM y x64, y solo admite la forma introducida por __asm en los procesadores x86.

Al compilar en modo ISO C mediante GCC o Clang (por ejemplo, con la opción - std = c11 ), __asm__ debe utilizarse en lugar de asm .

Ejemplos

Demuestra dos tipos de sintaxis de ensamblador en línea ofrecidos por el compilador GCC. Este programa solo funcionará correctamente en plataforma x86-64 bajo Linux. Nótese que el "ensamblador en línea estándar" también se trata como una extensión en el estándar C.

#include <stdio.h>
extern int func(void);
// the definition of func is written in assembly language
__asm__(".globl func\n\t"
        ".type func, @function\n\t"
        "func:\n\t"
        ".cfi_startproc\n\t"
        "movl $7, %eax\n\t"
        "ret\n\t"
        ".cfi_endproc");
int main(void)
{
    int n = func();
    // gcc's extended inline assembly
    __asm__ ("leal (%0,%0,4),%0"
           : "=r" (n)
           : "0" (n));
    printf("7*5 = %d\n", n);
    fflush(stdout); // flush is intentional
    // standard inline assembly in C++
    __asm__ ("movq $60, %rax\n\t" // the exit syscall number on Linux
             "movq $2,  %rdi\n\t" // this program returns 2
             "syscall");
}

Salida:

7*5 = 35

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • J.5.10 La palabra clave asm (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • J.5.10 La palabra clave asm (p: 422)
  • Estándar C11 (ISO/IEC 9899:2011):
  • J.5.10 La palabra clave asm (p: 580)
  • Estándar C99 (ISO/IEC 9899:1999):
  • J.5.10 La palabra clave asm (p: 512)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • G.5.10 La palabra clave asm

Véase también

Documentación de C++ para asm declaration

Enlaces externos

1. GCC Inline Assembly HOWTO
2. IBM XL C/C++ Inline Assembly
3. Intel C++ Inline Assembly
4. Visual Studio Inline Assembler
5. Sun Studio 12 Asm Statements
6. Inline assembly for Itanium-based HP-UX