Inline assembly
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
)
;
|
|||||||||
|
Dieser Abschnitt ist unvollständig
Grund: Eine Notiz zur GCC-erweiterten Assemblersyntax schreiben, da diese nun von Intel, IBM, Sun (ab v12), etc. unterstützt wird |
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
|