| |||
| Home > 인라인 및 임베디드 어셈블러 사용 > 임베디드 어셈블러 > 임베디드 어셈블리 함수의 생성 | |||
변환 단위의 모든 __asm 함수 본문은 마치 단일 파일로 연결된 다음
ARM 어셈블러로 전달되는 것처럼 어셈블됩니다. 템플릿 인스턴스화를 사용하여 생성되는 함수를 제외하면 어셈블러에 전달되는
어셈블리 파일의 __asm 함수 순서는 소스 파일과 같습니다.
이것은 반환 명령어가 생략된 경우 파일에서 첫 번째 함수의 끝에서 나와 다음__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
offsetof는 cstddef 헤더
파일의 기본 offsetof 매크로이므로 __cpp() 내에서
사용해야 합니다.
일반 __asm 함수는 .emb_text라는
이름으로 ELF 섹션에 배치됩니다. 즉, 임베디드 어셈블리 함수는 인라인되지 않습니다. 그러나 인라인 함수의 행 외부
사본과 암시적으로 인스턴스화된 템플릿 함수는 함수의 이름에서 파생된 이름 및 두 함수의 공통점인 추가 특성을 보유하고
같은 영역에 배치됩니다. 이 작업을 통해 이러한 함수의 특수한 의미가 유지됩니다.
인라인 함수의 행 외부 사본과 템플릿 함수 영역의 특수한 이름으로 인해 이 두 함수는 정의의 순서를 따르지
않고 임의 순서대로 놓입니다. 따라서 코드가 인라인 함수 또는 템플릿 함수 외부에서 실행되어 다른 __asm 함수로
건너뛴다고 생각할 수는 없습니다.