7.44 sp(r13)、lr(r14)、および pc(r15)へのアクセス

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

最初の方法では、インラインアセンブリで以下のようにコンパイラ組み込み関数を使用します。
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
}
この方法を使用すると、例えばデバッグ目的でコールツリーを表示するために、関数の復帰アドレスをキャプチャして表示できます。

ある関数が、コンパイラによって呼び出し側関数でインライン展開される場合があります。関数がインライン展開されると、キャプチャされるリターンアドレスは、そのインライン関数を呼び出した関数のリターンアドレスになります。また、関数は末尾呼び出しされることがあります。
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
関連する参考文書
10.137  __return_address コンパイラ組み込み関数
10.110 __current_pc コンパイラ組み込み関数
10.111 __current_sp コンパイラ組み込み関数
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.