Inline-Assembler
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 ) ; |
|||||||||
| Dieser Abschnitt ist unvollständig Grund: Schreiben Sie eine Notiz zur GCC Extended Assembly Syntax, da diese nun von Intel, IBM, Sun (ab v12) usw. unterstützt wird. |
[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 |