用汇编调用成员函数

成员函数的调用是编译器内部使用的 __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;
}    

posted on 2007-03-12 23:05 修一居士 阅读(2309) 评论(3)  编辑 收藏 引用

评论

# re: 用汇编调用成员函数 2007-03-23 13:36 shen126

int GetNum(){reutrn 3 ;] --> int GetNum(){return 3 ;}  回复  更多评论   

# re: 用汇编调用成员函数 2007-03-23 13:42 shen126

void Process(CTest* t , GETAMOUNT GetAmont)
...
...
...
30: __asm{
31: mov ecx, t ;传入this指针
004113E5 8B 4D 08 mov ecx,dword ptr [t]
32: call GetAmont ;调用成员函数
004113E8 FF 55 0C call dword ptr [GetAmont]
33: mov nResult, eax ;返回值在EAX中
004113EB 89 45 F8 mov dword ptr [nResult],eax
34: }


为什么 “31: mov ecx, t ;传入this指针” 翻译的结果是:“004113E5 8B 4D 08 mov ecx,dword ptr [t]” 而不是“004113E5 8B 4D 08 mov ecx, t”?

我是汇编初学,有点不太理解[t]的含义,t是函数地址,而ecx不正是要接收一个函数地址吗,为什么还要[]来解引用?
  回复  更多评论   

# re: 用汇编调用成员函数 2007-03-29 13:32 南斗

t是变量不是函数地址 []可有可无  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜