asm
declaration
asm-Deklaration ermöglicht das Einbetten von Assemblersprache-Quellcode in ein C++-Programm. Diese Deklaration ist bedingt unterstützt und (since C++11) implementierungsdefiniert, was bedeutet, dass sie möglicherweise nicht verfügbar ist und, selbst wenn sie von der Implementierung bereitgestellt wird, (since C++11) sie keine festgelegte Bedeutung hat.
Inhaltsverzeichnis |
Syntax
attr
(optional)
asm (
string-literal
)
;
|
(bis C++26) | ||||||||
attr
(optional)
asm (
balanced-token-seq
)
;
|
(seit C++26) | ||||||||
| attr | - | (since C++11) beliebige Anzahl von Attributen |
| string-literal | - | identisch zu String-Literalen , einschließlich Raw-String-Literalen |
| balanced-token-seq | - | eine Folge von Tokens, in der Klammern, eckige Klammern und geschweifte Klammern ausgeglichen sind; jegliche Einschränkungen der balanced-token-seq und ihre Bedeutung sind implementierungsdefiniert |
Erklärung
Die balanced-token-seq ist typischerweise ein String-Literal, das ein kurzes Programm in Assemblersprache repräsentiert, das ausgeführt wird, wenn diese Deklaration ausgeführt wird. Unterschiedliche C++-Compiler haben stark variierende Regeln für asm-Deklarationen und verschiedene Konventionen für die Interaktion mit dem umgebenden C++-Code.
Wie andere Block-Deklarationen kann diese Deklaration innerhalb eines Blocks (eines Funktionskörpers oder einer anderen zusammengesetzten Anweisung) erscheinen, und wie alle anderen Deklarationen kann diese Deklaration auch außerhalb eines Blocks erscheinen.
|
Dieser Abschnitt ist unvollständig
Grund: Eine Anmerkung zur GCC-erweiterten Assemblersyntax schreiben, da diese nun von Intel, IBM, Sun (ab v12), etc. unterstützt wird |
Hinweise
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_constexpr
|
201907L
|
(C++20) |
Triviale
Default-Initialisierung
und
Asm-Deklaration
in
constexpr
Funktionen
|
Schlüsselwörter
Beispiel
Demonstriert zwei Arten von Inline-Assembly-Syntax, die von den GCC/Clang-Compilern angeboten werden. Dieses Programm funktioniert nur korrekt auf der x86_64-Plattform unter Linux.
#include <iostream> extern "C" int func(int x); // the definition of func is written in assembly language // raw string literal could be very useful asm(R"( .globl func .type func, @function func: .cfi_startproc movl %edi, %eax /* x is in RDI, see x86-64 calling convention */ addl $1, %eax ret .cfi_endproc )"); int main() { int n = func(0110); // formerly non-standard inline assembly, made comforming by P2361R6 asm ("leal (%0,%0,4),%0" : "=r" (n) : "0" (n)); std::cout << "73*5 = " << n << std::endl; // flush is intentional // standard inline assembly asm ("movq $60, %rax\n" // the exit syscall number on Linux "movq $2, %rdi\n" // this program returns 2 "syscall"); }
Ausgabe:
73*5 = 365
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 195 | C++98 | es war erforderlich, alle asm-Deklarationen zu unterstützen | bedingt unterstützt gemacht |
| CWG 2262 | C++11 | Attribute konnten nicht auf asm-Deklarationen angewendet werden | erlaubt |
Referenzen
- C++26-Standard (ISO/IEC 14882:2026):
-
-
9.10 Die
asm-Deklaration [dcl.asm]
-
9.10 Die
- C++23-Standard (ISO/IEC 14882:2024):
-
-
9.10 Die
asm-Deklaration [dcl.asm]
-
9.10 Die
- C++20-Standard (ISO/IEC 14882:2020):
-
-
9.10 Die
asm-Deklaration [dcl.asm]
-
9.10 Die
- C++17-Standard (ISO/IEC 14882:2017):
-
-
10.4 Die
asm-Deklaration [dcl.asm]
-
10.4 Die
- C++14-Standard (ISO/IEC 14882:2014):
-
-
7.4 Die
asm-Deklaration [dcl.asm]
-
7.4 Die
- C++11-Standard (ISO/IEC 14882:2011):
-
-
7.4 Die
asm-Deklaration [dcl.asm]
-
7.4 Die
- C++03-Standard (ISO/IEC 14882:2003):
-
-
7.4 Die
asm-Deklaration [dcl.asm]
-
7.4 Die
- C++98-Standard (ISO/IEC 14882:1998):
-
-
7.4 Die
asm-Deklaration [dcl.asm]
-
7.4 Die
Siehe auch
|
C-Dokumentation
für
Inline-Assembler
|
Externe Links
| 1. | GCC Inline Assembly HOWTO |
| 2. | GCC Inline ASM — Locklessinc.com |
| 3. | IBM XL C/C++ Inline Assembly |
| 4. | Intel C++ Inline Assembly |
| 5. | Visual Studio Inline Assembler |
| 6. | Sun Studio 12 Asm Statements |
| 7. | Inline Assembly für Itanium-basiertes HP-UX |
| 8. | X86-Aufrufkonventionen — Wikipedia |