asm
declaration
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++ 코드와의 상호작용에 대한 다른 관례들을 가지고 있습니다.
다른 블록 선언 과 마찬가지로, 이 선언은 블록 내부(함수 본문 또는 다른 복합문)에 나타날 수 있으며, 다른 모든 선언과 마찬가지로 이 선언은 블록 외부에도 나타날 수 있습니다.
|
이 섹션은 불완전합니다
이유: GCC 확장 어셈블리 구문에 대한 설명을 추가해야 합니다. 현재 Intel, IBM, Sun(v12 기준) 등에서 지원 중이기 때문입니다 |
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_constexpr
|
201907L
|
(C++20) |
constexpr
함수에서의 trivial
기본 초기화
및
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]
-
9.10
- C++23 표준 (ISO/IEC 14882:2024):
-
-
9.10
asm선언 [dcl.asm]
-
9.10
- C++20 표준 (ISO/IEC 14882:2020):
-
-
9.10
asm선언 [dcl.asm]
-
9.10
- C++17 표준 (ISO/IEC 14882:2017):
-
-
10.4
asm선언 [dcl.asm]
-
10.4
- C++14 표준(ISO/IEC 14882:2014):
-
-
7.4
asm선언 [dcl.asm]
-
7.4
- C++11 표준 (ISO/IEC 14882:2011):
-
-
7.4
asm선언 [dcl.asm]
-
7.4
- C++03 표준(ISO/IEC 14882:2003):
-
-
7.4
asm선언 [dcl.asm]
-
7.4
- C++98 표준(ISO/IEC 14882:1998):
-
-
7.4
asm선언 [dcl.asm]
-
7.4
참고 항목
|
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 |