1. 程式人生 > >關於“在內聯彙編中不能呼叫類的成員函式“的誤解

關於“在內聯彙編中不能呼叫類的成員函式“的誤解

        MSDN的"inline assembly"中明確說明:在__asm塊中只能呼叫未過載的全域性C++函式,不能呼叫過載的全域性C++函式或一個類的成員函式。在VC6.0中,的確不能使用內聯彙編呼叫類的成員函式。但是經本人試驗,在VC2003中可以使用內聯彙編呼叫類的成員函式,相信在高版本的VC中也可以實現此功能。

        例如,以下程式在VC2003中可通過編譯並正確執行:(但是在VC6中是不能通過編譯的)

#include<iostream>
using namespace std;

class CTest
{
public:
	void Output(int i)
	{
		cout<< i <<endl;
	}
};

int main(void)
{
	CTest te;
	__asm
	{
		lea ecx, [te];
		push 100;
		call CTest::Output;
	}
}
        有兩個說明,在此再囉嗦一下:

  1.  this指標放到ecx暫存器裡
  2. 不需要手動清除棧
       但是,在內聯彙編中不能呼叫類的建構函式和過載的成員函式,所以在內聯彙編中呼叫類的成員函式其實沒有什麼意義。