Namespaces
Variants

asm declaration

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
Inline assembly

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.

Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_constexpr 201907L (C++20) Triviale Default-Initialisierung und Asm-Deklaration in constexpr Funktionen

Schlüsselwörter

asm

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]
  • C++23-Standard (ISO/IEC 14882:2024):
  • 9.10 Die asm -Deklaration [dcl.asm]
  • C++20-Standard (ISO/IEC 14882:2020):
  • 9.10 Die asm -Deklaration [dcl.asm]
  • C++17-Standard (ISO/IEC 14882:2017):
  • 10.4 Die asm -Deklaration [dcl.asm]
  • C++14-Standard (ISO/IEC 14882:2014):
  • 7.4 Die asm -Deklaration [dcl.asm]
  • C++11-Standard (ISO/IEC 14882:2011):
  • 7.4 Die asm -Deklaration [dcl.asm]
  • C++03-Standard (ISO/IEC 14882:2003):
  • 7.4 Die asm -Deklaration [dcl.asm]
  • C++98-Standard (ISO/IEC 14882:1998):
  • 7.4 Die asm -Deklaration [dcl.asm]

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