4.3.3. Thumb 状態の関数へのポインタ

Thumb 関数(Thumb コードで構成されており、Thumb 状態で実行される関数)へのポインタには、最下位ビットのセットが含まれている必要があります。これにより、インターワークが正常に行われます。

リンカでは、Thumb 命令を参照するラベルの値を再配置するときに、再配置する値の最下位ビットを自動的に設定します。Thumb 関数の絶対アドレスを使用した場合、リンカではこの操作を実行できません。

このため、コードで Thumb 関数の絶対アドレスを使用する必要がある場合は、そのアドレスに 1 を加算する必要があります。例えば、Example 4.5 のような Thumb 関数へのポインタテーブルを作成する場合があります。

詳細については、アセンブリ言語のインターワークを参照して下さい。

Example 4.5. Thumb 関数への絶対アドレス

typedef int (*FN)();

myfunc() {
    FN fnptrs[] = {
        (FN)(0x8084 + 1),  // Valid Thumb address
        (FN)(0x8074)       // Invalid Thumb address
    };
    FN* myfunctions = fnptrs;

    myfunctions[0]();    // Call OK
    myfunctions[1]();    // Call Fails
}
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential