Inline assembly
인라인 어셈블리(일반적으로 asm 키워드로 도입됨)는 C 프로그램 내에 어셈블리 언어 소스 코드를 삽입할 수 있는 기능을 제공합니다.
C++와 달리, 인라인 어셈블리는 C에서 확장 기능으로 취급됩니다. 이는 조건부로 지원되며 구현에 따라 정의되는 것으로, 존재하지 않을 수도 있고, 구현체에서 제공되더라도 고정된 의미를 갖지 않음을 의미합니다.
목차 |
구문
asm (
string_literal
)
;
|
|||||||||
|
이 섹션은 불완전합니다
이유: GCC 확장 어셈블리 구문에 대한 설명을 작성해야 합니다. 현재 Intel, IBM, Sun(v12 기준) 등에서 지원하기 때문입니다 |
설명
이러한 종류의 인라인 어셈블리 구문은 C++ 표준에서 허용되며 C++에서 asm-declaration 이라고 합니다. string_literal 은 일반적으로 어셈블리 언어로 작성된 짧은 프로그램으로, 이 선언이 실행될 때마다 실행됩니다. 서로 다른 C 컴파일러들은 asm-declaration에 대해 매우 다양한 규칙과 주변 C 코드와의 상호작용에 대한 다른 관례를 가지고 있습니다.
asm 선언은 블록(함수 본문 또는 다른 복합문) 내부에 나타날 수 있으며, 다른 모든 선언과 마찬가지로 이 선언도 블록 외부에 나타날 수 있습니다.
참고 사항
MSVC는 ARM 및 x64 프로세서에서 인라인 어셈블리를 지원하지 않으며, x86 프로세서에서만 __asm 으로 도입된 형태만 지원합니다.
GCC나 Clang으로 ISO C 모드에서 컴파일할 때(예: - std = c11 옵션 사용), __asm__ 를 asm 대신 사용해야 합니다.
예제
GCC 컴파일러가 제공하는 두 종류의 인라인 어셈블리 구문을 보여줍니다. 이 프로그램은 Linux에서 x86-64 플랫폼에서만 올바르게 작동합니다. "표준 인라인 어셈블리"도 C 표준에서 확장 기능으로 취급된다는 점에 유의하세요.
#include <stdio.h> extern int func(void); // the definition of func is written in assembly language __asm__(".globl func\n\t" ".type func, @function\n\t" "func:\n\t" ".cfi_startproc\n\t" "movl $7, %eax\n\t" "ret\n\t" ".cfi_endproc"); int main(void) { int n = func(); // gcc's extended inline assembly __asm__ ("leal (%0,%0,4),%0" : "=r" (n) : "0" (n)); printf("7*5 = %d\n", n); fflush(stdout); // flush is intentional // standard inline assembly in C++ __asm__ ("movq $60, %rax\n\t" // the exit syscall number on Linux "movq $2, %rdi\n\t" // this program returns 2 "syscall"); }
출력:
7*5 = 35
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- J.5.10 asm 키워드 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
-
- J.5.10 asm 키워드 (p: 422)
- C11 표준 (ISO/IEC 9899:2011):
-
- J.5.10 asm 키워드 (p: 580)
- C99 표준 (ISO/IEC 9899:1999):
-
- J.5.10 asm 키워드 (p: 512)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- G.5.10 asm 키워드
참고 항목
|
C++ 문서
참조:
asm
선언
|
외부 링크
| 1. | GCC 인라인 어셈블리 HOWTO |
| 2. | IBM XL C/C++ 인라인 어셈블리 |
| 3. | Intel C++ 인라인 어셈블리 |
| 4. | Visual Studio 인라인 어셈블러 |
| 5. | Sun Studio 12 Asm 문 |
| 6. | Itanium 기반 HP-UX용 인라인 어셈블리 |