6.2.4. 임베디드 어셈블리 함수의 생성

변환 단위의 모든 __asm 함수 본문은 마치 단일 파일로 연결된 다음 ARM 어셈블러로 전달되는 것처럼 어셈블됩니다. 템플릿 인스턴스화를 사용하여 생성되는 함수를 제외하면 어셈블러에 전달되는 어셈블리 파일의 __asm 함수 순서는 소스 파일과 같습니다.

Note

이것은 반환 명령어가 생략된 경우 파일에서 첫 번째 함수의 끝에서 나와 다음__asm 함수로 들어가는 방식으로 컨트롤이 한 __asm 함수에서 다른 함수로 넘어갈 수 있음을 의미합니다.

armcc를 호출할 때 어셈블러가 생성한 개체 파일이 단일 개체 파일을 생성하는 부분적 링크를 통해 컴파일러의 개체 파일과 결합됩니다.

컴파일러는 Example 6.2와 같이 각 __asm 함수에 대해 AREA 지시문을 생성합니다.

Example 6.2.  __asm 함수

#include <cstddef>
struct X
{
    int x,y;
    void addto_y(int);
};

__asm void X::addto_y(int)
{
    LDR      r2, [r0, #__cpp(offsetof(X, y))]
    ADD      r1, r2, r1
    STR      r1, [r0, #__cpp(offsetof(X, y))]
    BX       lr
}

이 함수에서 컴파일러는 다음을 생성합니다.

    AREA ||.emb_text||, CODE, READONLY
    EXPORT |_ZN1X7addto_yEi|
#line num "file"
|_ZN1X7addto_yEi| PROC
    LDR r2, [r0, #4]
    ADD r1, r2, r1
    STR r1, [r0, #4]
    BX lr

    ENDP
    END

offsetofcstddef 헤더 파일의 기본 offsetof 매크로이므로 __cpp() 내에서 사용해야 합니다.

일반 __asm 함수는 .emb_text라는 이름으로 ELF 섹션에 배치됩니다. 즉, 임베디드 어셈블리 함수는 인라인되지 않습니다. 그러나 인라인 함수의 행 외부 사본과 암시적으로 인스턴스화된 템플릿 함수는 함수의 이름에서 파생된 이름 및 두 함수의 공통점인 추가 특성을 보유하고 같은 영역에 배치됩니다. 이 작업을 통해 이러한 함수의 특수한 의미가 유지됩니다.

Note

인라인 함수의 행 외부 사본과 템플릿 함수 영역의 특수한 이름으로 인해 이 두 함수는 정의의 순서를 따르지 않고 임의 순서대로 놓입니다. 따라서 코드가 인라인 함수 또는 템플릿 함수 외부에서 실행되어 다른 __asm 함수로 건너뛴다고 생각할 수는 없습니다.

Copyright © 2002-2007 ARM Limited. All rights reserved.ARM DUI 0205HK
Non-Confidential