4.2.9. 비정적 멤버 함수 호출

이러한 키워드를 사용하여 __asm 함수에서 가상 및 가상이 아닌 함수를 호출할 수 있습니다. 정적 멤버 함수에 다른 매개 변수가 있어(즉, this가 없음) 호출 사이트가 이미 정적 멤버 함수를 호출하도록 지정되어 있을 수 있으므로 정적 멤버 함수를 검색할 수 있는 __mcall_is_static이 없습니다.

가상이 아닌 멤버 함수 호출

예를 들어 다음 코드를 사용하여 가상 또는 가상이 아닌 기본에서 가상이 아닌 함수를 호출할 수 있습니다.

// rp contains a D* and we wish to do the equivalent of rp->f() where f is a
// non-virtual function
// all arguments other than the this pointer are already setup
// assumes f does not return a struct
 if __mcall_is_in_vbase(D, f)
   LDR r12, [rp]                                    // fetch vtable pointer
   LDR r0, [r12, #-__mcall_offsetof_vbase(D, f)]    // fetch the vbase offset
   ADD r0, r0, rp                                   // do this adjustment
 else
   MOV r0, rp                                      // set up this pointer for D*
   ADD r0, r0, #__mcall_this_offset(D, f)          // do this adjustment
 endif
   BL __cpp(&D::f)                                 // call D::f

가상 멤버 함수 호출

예를 들어 다음 코드를 사용하여 가상 또는 가상이 아닌 기본에서 가상 함수를 호출할 수 있습니다.

// rp에 D* 포함, f가 가상이 아닌 함수인 rp->f()와 동일한 작업을
// 수행하려 함
// 이 포인터를 제외한 모든 인수가 이미 설정됨
// f가 구조체를 반환하지 않는다고 가정
if __mcall_is_in_vbase(D, f)
    LDR r12, [rp]                                 // fetch vtable pointer
    ldr r0, [r12, #-__mcall_offsetof_vbase(D, f)] // fetch the base offset
    ADD r0, r0, rp                                // do this adjustment
else
    MOV r0, rp                                    // set up this pointer for D*
    LDR r12, [rp]                                 // fetch vtable pointer
    ADD r0, r0, #__mcall_this_offset(D, f)        // do this adjustment
endif
    MOV lr, pc                                    // prepare lr
    LDR pc, [r12, #__vcall_offsetof_vfunc(D, f)]  // calls rp->f()
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0205GK
Non-Confidential