asm
declaration
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.
|
Cette section est incomplète
Motif : rédiger une note sur la syntaxe d'assemblage étendue de GCC, car elle est désormais prise en charge par Intel, IBM, Sun (à partir de la v12), etc. |
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
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]
-
9.10 La déclaration
- Norme C++23 (ISO/CEI 14882:2024) :
-
-
9.10 La déclaration
asm[dcl.asm]
-
9.10 La déclaration
- Norme C++20 (ISO/CEI 14882:2020) :
-
-
9.10 La déclaration
asm[dcl.asm]
-
9.10 La déclaration
- Norme C++17 (ISO/CEI 14882:2017) :
-
-
10.4 La déclaration
asm[dcl.asm]
-
10.4 La déclaration
- Norme C++14 (ISO/CEI 14882:2014) :
-
-
7.4 La déclaration
asm[dcl.asm]
-
7.4 La déclaration
- Norme C++11 (ISO/CEI 14882:2011) :
-
-
7.4 La déclaration
asm[dcl.asm]
-
7.4 La déclaration
- Norme C++03 (ISO/IEC 14882:2003) :
-
-
7.4 La déclaration
asm[dcl.asm]
-
7.4 La déclaration
- Norme C++98 (ISO/CEI 14882:1998) :
-
-
7.4 La déclaration
asm[dcl.asm]
-
7.4 La déclaration
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 |