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 선언 은 C++ 프로그램 내에 어셈블리 언어 소스 코드를 포함할 수 있는 기능을 제공합니다. 이 선언은 조건부 지원되며 (since C++11) 구현 정의 사항입니다. 이는 해당 기능이 존재하지 않을 수 있으며, 구현체에서 제공되더라도 (since C++11) 고정된 의미를 갖지 않음을 의미합니다.

목차

구문

attr  (선택 사항) asm ( string-literal ) ; (C++26 이전)
attr  (선택 사항) asm ( balanced-token-seq ) ; (C++26 이후)
attr - (C++11부터) 임의의 개수의 attributes
string-literal - string literal 와 동일하며, raw string literals 포함
balanced-token-seq - 괄호, 대괄호, 중괄호가 균형을 이루는 토큰 시퀀스; balanced-token-seq 에 대한 제한 사항과 그 의미는 구현체 정의

설명

balanced-token-seq 는 일반적으로 어셈블리 언어로 작성된 짧은 프로그램을 나타내는 문자열 리터럴로, 이 선언이 실행될 때마다 실행됩니다. 서로 다른 C++ 컴파일러들은 asm-선언에 대해 매우 다양한 규칙을 가지며, 주변 C++ 코드와의 상호작용에 대한 다른 관례들을 가지고 있습니다.

다른 블록 선언 과 마찬가지로, 이 선언은 블록 내부(함수 본문 또는 다른 복합문)에 나타날 수 있으며, 다른 모든 선언과 마찬가지로 이 선언은 블록 외부에도 나타날 수 있습니다.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_constexpr 201907L (C++20) constexpr 함수에서의 trivial 기본 초기화 asm 선언

키워드

asm

예제

GCC/Clang 컴파일러가 제공하는 두 종류의 인라인 어셈블리 문법을 보여줍니다. 이 프로그램은 Linux에서 x86_64 플랫폼에서만 정상적으로 동작합니다.

#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");
}

출력:

73*5 = 365

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 195 C++98 모든 asm 선언을 지원해야 했음 조건부 지원으로 변경됨
CWG 2262 C++11 속성을 asm 선언에 적용할 수 없었음 허용됨

참조문헌

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

참고 항목

C 문서 참조: 인라인 어셈블리

외부 링크

1. GCC 인라인 어셈블리 HOWTO
2. GCC 인라인 ASM — Locklessinc.com
3. IBM XL C/C++ 인라인 어셈블리
4. Intel C++ 인라인 어셈블리
5. Visual Studio 인라인 어셈블러
6. Sun Studio 12 Asm 문
7. Itanium 기반 HP-UX용 인라인 어셈블리
8. X86 호출 규약 — Wikipedia