asm-declaration gives the ability to embed assembly language source code within a C++ program. This declaration is conditionally-supported and (since C++11)implementation defined, meaning that it may not be present and, even when provided by the implementation, (since C++11)it does not have a fixed meaning.
[edit] Syntax attr (optional)asm (
string-literal )
;
(until C++26) attr (optional) asm (
balanced-token-seq )
;
(since C++26) attr - (since C++11) any number of attributes string-literal - same as in string literal, including raw string literals balanced-token-seq - a sequence of tokens where parentheses, brackets and braces are balanced; any restrictions on the balanced-token-seq and its meaning are implementation-defined [edit] Explanation
The balanced-token-seq is typically a string literal that represents a short program written in assembly language, which is executed whenever this declaration is executed. Different C++ compilers have wildly varying rules for asm-declarations, and different conventions for the interaction with the surrounding C++ code.
As other block declarations, this declaration can appear inside a block (a function body or another compound statement), and, as all other declarations, this declaration can also appear outside a block.
[edit] Notes [edit] Keywords [edit] ExampleDemonstrates two kinds of inline assembly syntax offered by the GCC/Clang compilers. This program works correctly only on the x86_64 platform under 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"); }
Output:
[edit] Defect reportsThe following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior CWG 195 C++98 it was required to support all asm declarations made conditionally-supported CWG 2262 C++11 attributes could not be applied to asm declarations allowed [edit] Referencesasm
declaration [dcl.asm]asm
declaration [dcl.asm]asm
declaration [dcl.asm]asm
declaration [dcl.asm]asm
declaration [dcl.asm]asm
declaration [dcl.asm]asm
declaration [dcl.asm]asm
declaration [dcl.asm]RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4