用汇编调用成员函数

用汇编调用成员函数

成员函数的调用是编译器内部使用的 __thiscall 即需要this指针,
所以我们调用成员函数必须满足的条件是
1 需要this指针,
2 成员函数有固定的函数地址

先看条件 1  
this指针是在函数调用前用ECX寄存器传入的,
所以我们只需要提前讲this指针赋值给ECX即可

条件2
成员函数是有固定的地址的,也就是说我们可以直接调用,不过大多数情况下因为要访问成员变量,所以如果没有this指针,会在访问时产生异常.对于不需要this指针的成员函数可以正常调用.
如类 CTest

class CTest
{
public :

 CTest() : m_nData (
5 ){}

 
int  GetNum(){reutrn  3 ;]

 
int  GetAmount(){return  2   +  m_nData;}
private :
 
int  m_nData;
};


// 可以这样调用GetNum
return ((CTest
* ) 0 ) -> GetNum();


这两个条件都可以满足,所以代码如下:
typedef  int  (CTest:: * GETAMOUNT)();

void Process(CTest
&  t , GETAMOUNT GetAmont)
{
  
int  nResult  = 0 ;
  __asm{
     mov ecx,[t]      ;传入this指针
     
call  GetAmont    ;调用成员函数
     mov nResult, eax ;返回值在EAX中
        }
  cout
<< nResult << endl;
}

int  main( int  argc, char *  argv[])
{
  CTest test;

  Process(test, 
& CTest::GetAmount);    
  return 
0 ;
}    

你可能感兴趣的:(用汇编调用成员函数)