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