如何将私有类成员的地址放入 EAX

How do I put an address for private class members into EAX?

本文关键字:地址 EAX 成员      更新时间:2023-10-16

你能帮我把私人班级成员的地址放进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? */
        }
    }
};

什么编译器?"this"的值保存在ecx寄存器中似乎是惯例。任何成员的地址,无论他们是公共的还是私有的都没有区别,都将是"this"的偏移量,这取决于他们在类声明中的声明顺序。

在您的示例中,假设没有 vtable,"a"的地址将是"ecx",而"b"的地址将是"ecx + sizeof(int)"。

您也可以使用"lea"指令。

我不知道

你为什么要这样做,但这里有一个使用 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)
    );
}

谢谢大家!问题撤回。事实上,一切都很简单。

将 p1 设置为示例::a。

lea eax, this
mov edx,  p1
mov [eax], edx

第二名成员的地址 [此 + 4]但是第二个参数作为常量int &.它是为了明天。