인라인 어셈블리 언어. 저게 뭐에요?

인라인 어셈블러는 C와 같은 고급 언어에서 컴파일된 코드 중에서 어셈블리 언어로 작성된 저급 코드를 프로그램 내에 포함할 수 있도록 하는 일부 컴파일러의 일부입니다.

어셈블리 언어 코드 포함은 일반적으로 다음 이유 중 하나로 수행됩니다.
  • 최적화.
  • 프로세서별 지침으로 전달합니다.
  • 컴파일러에서 아직 지원하지 않는 특정 호출 규칙으로 전달합니다.
  • 시스템 호출 및 인터럽트: 고급 언어에는 임의의 시스템 호출을 수행할 수 있는 직접적인 기능이 거의 없으므로 어셈블리 코드가 사용됩니다.
  • 섹션, 매크로 변경 또는 기호 별칭 만들기와 같은 링커 또는 어셈블러에 대한 특수 지시문을 내보냅니다.

  • 예:

    GCC 컴파일러에서 제공하는 두 종류의 인라인 어셈블리 구문을 보여줍니다. 이 프로그램은 Linux의 x86-64 플랫폼에서만 올바르게 작동합니다.

    #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
    


    _인라인 어셈블러는 레지스터 할당의 중요한 부분인 개별 변수에 대해 수행되는 작업의 분석을 혼동하기 때문에 컴파일러에 직접적인 문제를 제기합니다. 성능이 떨어질 수 있음을 나타냅니다. 인라인 어셈블러는 또한 프로그램의 향후 포팅 및 유지 관리를 복잡하게 만듭니다.

    컴파일러와 프로그래머 모두의 작업을 단순화하기 위해 대체 구조가 종종 제공됩니다. 대부분의 컴파일러는 특수 명령을 위한 고유 함수를 제공하며 임의의 시스템 호출을 위한 C 함수 래퍼는 모든 Unix 플랫폼에서 사용할 수 있습니다._

    일반적으로 "내장"은 내장 함수, 즉 컴파일러가 라이브러리에서 기본 함수를 호출하는 대신 인라인을 유발할 수 있는 가장 일반적인 라이브러리 함수를 안내합니다. 예를 들어, memset(array1, 10, 0)과 같은 호출은 다음과 같이 x86에 대해 컴파일할 수 있습니다.

    mov ecx, 10
     xor eax, eax
     mov edi, offset FLAT:array1
     rep stosb
    


    이와 같은 내장 함수는 순전히 최적화입니다. "필요한"내장 함수는 컴파일러가 직접 생성할 수 없는(또는 일반적으로 생성하지 않는) 코드를 개발할 수 있도록 컴파일러가 내장 함수를 지원하는 경우일 가능성이 높습니다. 분명한 예를 들어, x86용 꽤 많은 컴파일러에는 MMX 명령의 직접적인 표현인 "함수"를 사용할 수 있는 "MMX 내장 함수"가 있습니다.

    내장 함수 또는 JavaScript를 사용한 인라인 어셈블리가 있습니까?



    솔직히 이 질문에 대해 많이 검색했고 이 정보만 찾았습니다. 지금은 이 블로그 게시물을 진행 중인 작업으로 남겨두겠습니다. 의견이 있으시면 공유해 주십시오. 감사합니다. 이 연구에 도움을 주셔서 감사합니다.

    https://github.com/WebAssembly/design/issues/1206
    https://webassembly.org
    https://stackoverflow.com/questions/12168575/executing-generated-assembler-inline

    자원



    https://wiki.cdot.senecacollege.ca/wiki/Inline_Assembly_Language
    https://en.cppreference.com/w/c/language/asm
    https://en.wikipedia.org/wiki/Inline_assembler
    https://stackoverflow.com/questions/2268562/what-are-intrinsics
    https://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C
    https://stackoverflow.com/questions/48518225/what-are-intrinsic-types-in-javascript
    https://stackoverflow.com/questions/12168575/executing-generated-assembler-inline
    https://github.com/v8/v8/blob/master/src/objects/dictionary.h

    결론



    ⚠️ 컴퓨터 아키텍처 블로그 게시물: 링크

    연결



    🖇 팔로우GitHub

    🖇 팔로우

    _p.s 이 게시물은 내 소프트웨어 이식성 및 최적화 수업을 위해 작성되었습니다.

    좋은 웹페이지 즐겨찾기