Namespaces
Variants

Inline assembly

From cppreference.net

Inline-Assembly (typischerweise eingeführt durch das asm Schlüsselwort) ermöglicht das Einbetten von Assembler-Quellcode in ein C-Programm.

Im Gegensatz zu C++ wird Inline-Assembler in C als Erweiterung behandelt. Es ist bedingt unterstützt und implementierungsdefiniert, was bedeutet, dass es möglicherweise nicht vorhanden ist und selbst wenn es von der Implementierung bereitgestellt wird, keine festgelegte Bedeutung hat.

Inhaltsverzeichnis

Syntax

asm ( string_literal ) ;

Erklärung

Diese Art von Inline-Assembly-Syntax wird vom C++-Standard akzeptiert und heißt asm-declaration in C++. Der string_literal ist typischerweise ein kurzes Programm in Assemblersprache, das ausgeführt wird, wann immer diese Deklaration ausgeführt wird. Unterschiedliche C-Compiler haben stark variierende Regeln für asm-declarations und verschiedene Konventionen für die Interaktion mit dem umgebenden C-Code.

Die asm-Deklaration kann innerhalb eines Blocks (einer Funktionsdefinition oder einer anderen zusammengesetzten Anweisung) erscheinen und, wie alle anderen Deklarationen, kann diese Deklaration auch außerhalb eines Blocks erscheinen.

Hinweise

MSVC unterstützt keinen Inline-Assembler auf ARM- und x64-Prozessoren und unterstützt nur die durch __asm eingeführte Form auf x86-Prozessoren.

Beim Kompilieren im ISO-C-Modus mit GCC oder Clang (z.B. mit der Option - std = c11 ) muss __asm__ anstelle von asm verwendet werden.

Beispiele

Demonstriert zwei Arten von Inline-Assembly-Syntax, die vom GCC-Compiler angeboten werden. Dieses Programm wird nur auf der x86-64-Plattform unter Linux korrekt funktionieren. Beachten Sie, dass die "standard Inline-Assembly" auch als Erweiterung im C-Standard behandelt wird.

#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");
}

Ausgabe:

7*5 = 35

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • J.5.10 Das asm-Schlüsselwort (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • J.5.10 Das asm-Schlüsselwort (S: 422)
  • C11-Standard (ISO/IEC 9899:2011):
  • J.5.10 Das asm-Schlüsselwort (S: 580)
  • C99-Standard (ISO/IEC 9899:1999):
  • J.5.10 Das asm-Schlüsselwort (S. 512)
  • C89/C90-Standard (ISO/IEC 9899:1990):
  • G.5.10 Das asm-Schlüsselwort

Siehe auch

C++ Dokumentation für asm Deklaration

Externe Links

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 für Itanium-basiertes HP-UX