Namensräume
Varianten
Aktionen

Inline-Assembler

Von cppreference.com
< c‎ | Sprache

Inline-Assembly (typischerweise eingeleitet durch das Schlüsselwort asm) gibt die Möglichkeit, Assemblersprachigen Quellcode in ein C-Programm einzubetten.

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

Inhalt

[bearbeiten] Syntax

asm ( string_literal ) ;

[bearbeiten] Erklärung

Diese Art von Inline-Assembly-Syntax wird vom C++-Standard akzeptiert und in C++ als asm-declaration bezeichnet. Der string_literal ist typischerweise ein kurzes Programm, das in Assemblersprache geschrieben ist und bei jeder Ausführung dieser Deklaration ausgeführt wird. Verschiedene C-Compiler haben stark variierende Regeln für asm-Deklarationen und unterschiedliche Konventionen für die Interaktion mit dem umgebenden C-Code.

Eine asm-Deklaration kann innerhalb eines Blocks (dem Körper einer Funktion oder einer anderen zusammengesetzten Anweisung) erscheinen, und wie alle anderen Deklarationen kann diese Deklaration auch außerhalb eines Blocks erscheinen.

[bearbeiten] Hinweise

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

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

[bearbeiten] Beispiele

Demonstriert zwei Arten von Inline-Assembly-Syntaxen, die vom GCC-Compiler angeboten werden. Dieses Programm funktioniert nur korrekt auf der x86-64-Plattform unter Linux. Beachten Sie, dass die "Standard-Inline-Assembly" auch im C-Standard als Erweiterung 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

[bearbeiten] Referenzen

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

[bearbeiten] Siehe auch

C++-Dokumentation für asm-Deklaration

[bearbeiten] 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-basierte HP-UX