您能帮助我将私人班级成员的地址导入EAX吗?与mov eax, this->??
一样。
class Example
{
private :
int a;
int b;
public :
void SetValues(int p1, const int &p2)
{
asm
{
mov eax, this-> /* How do I get the address of private members? */
}
}
};
答案 0 :(得分:0)
什么编译器?似乎是惯例,'this'的值保存在ecx寄存器中。任何成员的地址,如果它们是公共的或私有的,都没有区别,将与'this'相抵消,这取决于它们在类声明中的声明顺序。
在你的例子中,'a'的地址为'ecx','b'的地址为'ecx + sizeof(int)',假设没有vtable。
你也可以使用'lea'指令。
答案 1 :(得分:0)
我不知道你为什么要这样做,但这是一个功能实例gcc
void SetValues(int p1, const int &p2) // what are these arguments for?
{
__asm__(
"movl %0, %%eax" // movl src, dest. you may need to reverse operands
: // no outputs
: "r"(&this->a) // %0 will hold the address of a
);
}
如果您使用的是64位,那么正确的稍微不那么糟糕的方法就是使用movq
和rax
void SetValues(int p1, const int &p2)
{
__asm__(
"movq %0, %%rax"
: // no outputs
: "r"(&this->a)
);
}
答案 2 :(得分:0)
谢谢大家!问题撤回。事实上,一切都很简单。
将p1设置为Example :: a。
lea eax, this
mov edx, p1
mov [eax], edx
第二名成员的地址[this + 4] 但第二个参数为const int&。 它是明天。