Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      asm declaration

      From cppreference.com
      <cpp‎ |language
       
       
      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
       
      Declarations
       

      asm-declaration gives the ability to embed assembly language source code within a C++ program. This declaration isconditionally-supported and(since C++11)implementation defined, meaning thatit may not be present and, even when provided by the implementation,(since C++11)it does not have a fixed meaning.

      Contents

      [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 ofattributes
      string-literal - same as instring literal, including raw string literals
      balanced-token-seq - a sequence of tokens where parentheses, brackets and braces are balanced; any restrictions on thebalanced-token-seq and its meaning are implementation-defined

      [edit]Explanation

      Thebalanced-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 otherblock 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.

      This section is incomplete
      Reason: write a note on GCC extended assembly syntax, since it is now supported by Intel, IBM, Sun (as of v12), etc

      [edit]Notes

      Feature-test macroValueStdFeature
      __cpp_constexpr201907L(C++20)Trivialdefault initialization andasm-declaration inconstexpr functions

      [edit]Keywords

      asm

      [edit]Example

      Demonstrates two kinds of inline assembly syntax offered by the GCC/Clang compilers. This program works correctly only on the x86_64 platform under Linux.

      Run this code
      #include <iostream> extern"C"int func(int x);// the definition of func is written in assembly language// raw string literal could be very usefulasm(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:

      73*5 = 365

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      CWG 195C++98it was required to support all asm declarationsmade conditionally-supported
      CWG 2262C++11attributes could not be applied to asm declarationsallowed

      [edit]References

      • C++26 standard (ISO/IEC 14882:2026):
      • 9.10 Theasm declaration [dcl.asm]
      • C++23 standard (ISO/IEC 14882:2024):
      • 9.10 Theasm declaration [dcl.asm]
      • C++20 standard (ISO/IEC 14882:2020):
      • 9.10 Theasm declaration [dcl.asm]
      • C++17 standard (ISO/IEC 14882:2017):
      • 10.4 Theasm declaration [dcl.asm]
      • C++14 standard (ISO/IEC 14882:2014):
      • 7.4 Theasm declaration [dcl.asm]
      • C++11 standard (ISO/IEC 14882:2011):
      • 7.4 Theasm declaration [dcl.asm]
      • C++03 standard (ISO/IEC 14882:2003):
      • 7.4 Theasm declaration [dcl.asm]
      • C++98 standard (ISO/IEC 14882:1998):
      • 7.4 Theasm declaration [dcl.asm]

      [edit]See also

      C documentation forInline assembly

      [edit]External 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 for Itanium-based HP-UX
      8. X86 calling conventions — Wikipedia
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/language/asm&oldid=178574"

      [8]ページ先頭

      ©2009-2025 Movatter.jp