| |||
| Home > 인라인 및 임베디드 어셈블러 > 임베디드 어셈블러 > 비정적 멤버 함수 호출 | |||
이러한 키워드를 사용하여 __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()