C++中嵌入汇编时如何调用类成员变量?
Mal 2002-08-20 02:23:47 有以下一例程:
//==============================
class AClass
{
public:
int anInt;
void edit();
};
void AClass::edit()
{
__asm {
MOV AX, WORD PTR anInt
}
}
void main()
{
AClass anObj;
}
//=======================================
有编译错误:
TC++3 : Expression Syntax
VC++6 : error C2420: 'anInt' : illegal symbol in second operand
我试图以rhis指针指向anInt,即:
MOV AX, WORD PTR anInt 改为 MOV AX, WORD PTR this->anInt
则相信由于->为C++操作符造成错误,有编译错误:
TC++3 : Expression Syntax
VC++6 : error C2400: inline assembler syntax error in 'third operand'; found 'bad token'
error C2400: inline assembler syntax error in 'opcode'; found 'bad token'
寻旧帖,有一例“VC的嵌入汇编中如何调用外部的函数,如类的成员函数updatedata()之类”(由goby()于2002-2-7 11:29:28发表于VC板)。其中有一方法为使用局部变量令标号合法(gboy(hello) 2002-2-7 12:26:07):
//=================================
MYFUN pFun=CWnd::UpdateData;
_asm
{
push 1
mov ecx,dword ptr [ebp-4]
call pFun
}
//==================================
故以此为据试之:
//==================================
void AClass::edit()
{
int b = this->anInt;
__asm {
MOV AX, WORD PTR b
INC AX
MOV WORD PTR b, AX
}
this->anInt = b;
}
//===================================
可行,但效率不佳。欲改换以指针或引用以提高效率。
试以缺省参数传递:
//===================================
void AClass::edit(int& b=anInt)
//===================================
则引发error C2648: 'anInt' : use of member as default parameter requires static member错误
换以另一函数对其进行封装:
//===================================
void edit(){editF(&this->anInt)};
void editF(int* b)
{
__asm {
MOV AX, WORD PTR b
INC AX
MOV WORD PTR b, AX
}
}
//====================================
则编译通过,但结果不正确,因为当前操作的是指针b而非b所指向的anInt,忘记了汇编的寻址语法,无计可施……
求正确的寻址语法,或更简单的调用成员变量的方法,薄酬。