关于 接口与对象指针对成员函数的调用时的汇编执行行为分析

测试方法:

interface IA1
{
public:
virtual void f1() = 0;
virtual void f2() = 0;
};


interface IA2
{
public:
virtual void f3() = 0;
virtual void f4() = 0;


};




class CB1 : public IA1
 , public IA2
{
public:
void fb1()
{
int i = 0;
printf("fb1 - this:0x%08x", this);
}
};


class CB2 : public IA1
 , public IA2
{
public:
void fb2()
{
int i = 0;
}
void f1()
{
;
}
void f2()
{
;
}
void f3()
{
;
}
void f4()
{
;
}
};


class CC : public CB1
, public CB2
{
public:
void f1()
{
int i = 1;
printf("f1:0x%08x 0x%08x\n", &CC::f1, this);
}
void f2()
{
int i = 1;
printf("f2:0x%08x 0x%08x\n", &CC::f2);
}
void f3()
{
int i = 1;
printf("f3:0x%08x 0x%08x\n", &CC::f3);
}
void f4()
{
int i = 1;
printf("f4:0x%08x 0x%08x\n", &CC::f4);
}

};


结果:

    -  -0x00df4180CC::`RTTI Complete Object Locator':[0xdf4c80]
this vtable==CC::CB1::IA1->0x007a34e8->0x00df4184pointer to->CC::f1()
0x00df4188pointer to->CC::f2()
0x00df418c???Unknown Data. Like const string.
pCB1IA2::CC::CB1::IA2->0x007a34ec->0x00df4178pointer to->CC::f3()
0x00df417cpointer to->CC::f4()
0x00df4180CC::`RTTI Complete Object Locator':[0xdf4c80]
pCB2IA1==CC::CB2::IA1 vtable->0x007a34f00x00df416cpointer to->[thunk(p-8)]CC::f1
0x00DF4170pointer to->[thunk(p-8)]CC::f2
0x00DF4174CC::`RTTI Complete Object Locator':[0xdf4e68]
pCB2IA2==CC::CB2::IA2 vtable->0x007a34f40x00df4160pointer to->[thunk(p-8)]CC::f3
0x00df4164pointer to->[thunk(p-8)]CC::f4
0x00df4168CC::`RTTI Complete Object Locator':[0xdf4e7c]

测试结果分析:

指针在调用时会把调用的指针存入ECX寄存器,thunk对ECX寄存器做减法运算得到真实的this.在调用类函数的时候,如果使用this指针的调用,在调用函数f1、f2时候是直接调用(this值存入ECX),f3、f4时候会先把this值加上4,然后存入ECX调用函数。当使用接口指针调用时,接口指针直接放入ECX,然后调用程序。根据不同的情况,会进入一个临时的thunk代码里面,thunk代码会对存入ECX的指针作出调整,使进入真正的函数前this总是正确的。 
从上面的分析还可以看出,每个接口指针的上一个值DWORD】,是当前指针的RTTI信息,不知道是不是只有Debug版本才有???


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值