従来のコードでの sp(r13)、lr(r14)、および pc(r15)へのアクセス

以下の方法を使用して、ソースコード内から splr、および pc の各レジスタに正しくアクセスできます。

方法 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

ある関数が、コンパイラによって呼び出し側関数でインライン展開される場合があります。関数がインライン展開されると、キャプチャされる復帰アドレスは、そのインライン関数を呼び出した関数の復帰アドレスになります。また、関数は末尾呼び出しされることがあります。

Show/hide関連項目

Copyright © 2010 ARM. All rights reserved.ARM DUI 0472BJ
Non-ConfidentialID011811