Namespaces
Variants

Inline assembly

From cppreference.net

인라인 어셈블리(일반적으로 asm 키워드로 도입됨)는 C 프로그램 내에 어셈블리 언어 소스 코드를 삽입할 수 있는 기능을 제공합니다.

C++와 달리, 인라인 어셈블리는 C에서 확장 기능으로 취급됩니다. 이는 조건부로 지원되며 구현에 따라 정의되는 것으로, 존재하지 않을 수도 있고, 구현체에서 제공되더라도 고정된 의미를 갖지 않음을 의미합니다.

목차

구문

asm ( string_literal ) ;

설명

이러한 종류의 인라인 어셈블리 구문은 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용 인라인 어셈블리