2014-11-14 61 views
-2

你能帮我把私人班级成员的地址写入EAX吗?像mov eax, this->??如何将私人类成员的地址放入EAX中?

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

哪个编译器/内联汇编器?如果在范围IIRC中,VC++可以引用任何C++符号。 – plinth 2014-11-14 20:37:23

回答

0

什么编译器? “this”的价值在ecx注册簿中保留似乎是惯例。任何成员的地址,如果他们是公开的或私人的,都不会有任何区别,它会抵消'this',这取决于他们在类声明中的声明顺序。

在您的示例中,假设没有vtable,则'a'的地址为'ecx','b'的地址为'ecx + sizeof(int)'。

你也可以使用'lea'指令。

+0

然后,如果有任何基类或者如果你有虚函数的话,事情会变得非常难看。也可能有对齐填充。 – 2014-11-14 20:40:43

+0

对不起,我的英语。是的,我通过edx尝试过。和lea,和mov。我可以通过edx读取数值。但要设定 - 我不能。 IDE - C++ Builder。 – Vsevolod 2014-11-14 20:44:57

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) 
    ); 
} 
+0

如果我们有8字节的指针,它不应该是'rax'吗? – Columbo 2014-11-14 20:49:43

+0

解决方案非常有趣。但它并没有改变这个事实。无论如何,你应该尝试直接访问。 – Vsevolod 2014-11-14 20:54:58

+0

@Columbo假设64位,是的。我自己用rax实现了它,但是对eax的请求让我觉得OP在32位系统上 – 2014-11-14 21:30:13

0

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

set p1 to Example :: a。第二构件[本+ 4] 但是第二PARAM如const int的&的

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

地址。 明天。