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-declaration donne la capacité d'intégrer du code source en langage assembleur dans un programme C++. Cette déclaration est conditionnellement supportée et (since C++11) définie par l'implémentation, ce qui signifie que elle peut ne pas être présente et, même lorsqu'elle est fournie par l'implémentation, (since C++11) elle n'a pas de signification fixe.

Table des matières

Syntaxe

attr  (optionnel) asm ( string-literal ) ; (jusqu'en C++26)
attr  (optionnel) asm ( balanced-token-seq ) ; (depuis C++26)
attr - (depuis C++11) n'importe quel nombre d' attributs
string-literal - identique aux littéraux de chaîne , y compris les littéraux de chaîne bruts
balanced-token-seq - une séquence de tokens où les parenthèses, crochets et accolades sont équilibrés ; toute restriction sur la balanced-token-seq et sa signification sont définies par l'implémentation

Explication

Le balanced-token-seq est généralement un littéral de chaîne qui représente un programme court écrit en langage assembleur, qui est exécuté chaque fois que cette déclaration est exécutée. Différents compilateurs C++ ont des règles extrêmement variables pour les déclarations asm, et différentes conventions pour l'interaction avec le code C++ environnant.

Comme les autres déclarations de bloc , cette déclaration peut apparaître à l'intérieur d'un bloc (un corps de fonction ou une autre instruction composée), et, comme toutes les autres déclarations, cette déclaration peut également apparaître à l'extérieur d'un bloc.

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_constexpr 201907L (C++20) Initialisation par défaut triviale default initialization et asm-declaration dans les fonctions constexpr

Mots-clés

asm

Exemple

Démontre deux types de syntaxe d'assemblage en ligne offerts par les compilateurs GCC/Clang. Ce programme fonctionne correctement uniquement sur la plateforme x86_64 sous 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");
}

Sortie :

73*5 = 365

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
CWG 195 C++98 il était requis de supporter toutes les déclarations asm rendu conditionnellement supporté
CWG 2262 C++11 les attributs ne pouvaient pas être appliqués aux déclarations asm autorisé

Références

  • Norme C++26 (ISO/IEC 14882:2026) :
  • 9.10 La déclaration asm [dcl.asm]
  • Norme C++23 (ISO/CEI 14882:2024) :
  • 9.10 La déclaration asm [dcl.asm]
  • Norme C++20 (ISO/CEI 14882:2020) :
  • 9.10 La déclaration asm [dcl.asm]
  • Norme C++17 (ISO/CEI 14882:2017) :
  • 10.4 La déclaration asm [dcl.asm]
  • Norme C++14 (ISO/CEI 14882:2014) :
  • 7.4 La déclaration asm [dcl.asm]
  • Norme C++11 (ISO/CEI 14882:2011) :
  • 7.4 La déclaration asm [dcl.asm]
  • Norme C++03 (ISO/IEC 14882:2003) :
  • 7.4 La déclaration asm [dcl.asm]
  • Norme C++98 (ISO/CEI 14882:1998) :
  • 7.4 La déclaration asm [dcl.asm]

Voir aussi

Documentation C pour Inline assembly

Liens externes

1. Guide GCC Inline Assembly HOWTO
2. GCC Inline ASM — Locklessinc.com
3. Assembleur en ligne IBM XL C/C++
4. Assembleur en ligne Intel C++
5. Assembleur en ligne Visual Studio
6. Instructions Asm Sun Studio 12
7. Assembleur en ligne pour HP-UX basé sur Itanium
8. Conventions d'appel X86 — Wikipédia