如何将私人班级成员的地址放入EAX?

时间:2014-11-14 20:26:33

标签: c++ class assembly this

您能帮助我将私人班级成员的地址导入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? */
        }
    }
};

3 个答案:

答案 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位,那么正确的稍微不那么糟糕的方法就是使用movqrax

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&。 它是明天。