4.3.1. 레거시 코드에서 sp (r13), lr (r14) 및 pc (r15) 액세스

다음 솔루션을 사용하면 소스 코드에서 sp, lrpc 레지스터에 제대로 액세스할 수 있습니다.

솔루션 1

인라인 어셈블러에서 다음과 같이 컴파일러를 사용합니다.

void printReg()
{
    unsigned int spReg, lrReg, pcReg;

    __asm {
        MOV spReg, __current_sp()
        MOV pcReg, __current_pc()
        MOV lrReg, __return_address()
    }
    printf("SP = 0x%X\n",spReg);
    printf("PC = 0x%X\n",pcReg);
    printf("LR = 0x%X\n",lrReg);
}
솔루션 2

임베디드 어셈블리를 사용하여 C 또는 C++ 소스 파일 내에서 다음과 같이 물리 ARM 레지스터에 액세스합니다.

__asm void func()
{
    MOV r0, lr
    ...
        BX lr
}

이 방법을 사용하면, 예를 들어 디버깅 목적으로 호출 트리를 표시하기 위해 함수의 반환 주소를 캡처하고 표시할 수 있습니다(임베디드 어셈블러 참조).

Note

컴파일러에서 함수를 호출자 함수로 인라인할 수도 있습니다. 함수가 인라인되면 반환 주소는 인라인된 함수를 호출하는 함수의 반환 주소가 됩니다. 또한 함수가 마무리 호출될 수 있습니다. 자세한 내용은 __return_address()을 참조하십시오.

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0205GK
Non-Confidential