7.43 仮想メンバ関数の呼び出し

以下の例では、仮想ベースまたは非仮想ベースのいずれかで仮想関数を呼び出すコードを示します。

// rp は D* を格納する。rp->f() の等価の機能を実現する。ここで、f は
// 仮想関数
// this ポインタ以外のすべての引数は既に設定済み
// f が struct を返さないと想定する
 if __mcall_is_in_vbase(D, f)
    LDR r12, [rp]                                 // vtable ポインタをフェッチする
    LDR r0, [r12, #-__mcall_offsetof_vbase(D, f)] // base オフセットをフェッチする
    ADD r0, r0, rp                                // this 調整を行う
    LDR r12, [r0]                                 // vbase vtable ポインタをフェッチする
 else
    MOV r0, rp                                    // D* のポインタを設定する
    LDR r12, [rp]                                 // vtable ポインタをフェッチする
    ADD r0, r0, #__mcall_this_offset(D, f)        // this 調整を行う
 endif
    MOV lr, pc                                    // lr を準備する
    LDR pc, [r12, #__vcall_offsetof_vfunc(D, f)]  // rp->f() を呼び出す
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
7.41 組み込みアセンブラの非スタティックメンバ関数の呼び出し
7.42 非仮想メンバ関数の呼び出し
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.