从Visual C++中的内联汇编访问类成员

Pav*_*syn 6 c++ assembly inline-assembly

这是我的代码:

void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
    __asm 
    {
        Mov Eax, y
        Mov Ebx, _width
        Mul Ebx
        Add Eax, x
        Shl Eax, 2 // Multiply by four
        Add Eax, _buffer
        Mov Edi, Eax
        Mov Eax, c
        StosD
    }
}
Run Code Online (Sandbox Code Playgroud)

_buffer和_width是Graph类成员:

private:
    DWORD _width;
    DWORD* _buffer;
Run Code Online (Sandbox Code Playgroud)

这是行不通的; 我从两个变量得到0值,但实际上它们还有其他一些值.

我可以通过将类变量复制到局部变量并使用它们来解决它:

void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
    DWORD bufAddr = (DWORD)_buffer;
    DWORD w = _width;
    __asm 
    {
        Mov Eax, y
        Mov Ebx, w
        Mul Ebx
        Add Eax, x
        Shl Eax, 2 // Multiply by four
        Add Eax, bufAddr
        Mov Edi, Eax
        Mov Eax, c
        StosD
    }
}
Run Code Online (Sandbox Code Playgroud)

直接使用有什么问题?可能吗?

Nec*_*lis 7

在关闭的机会,你有什么事情,确实需要总成(见博的答案),有一篇文章在这里的访问C或C++内联汇编块中的数据.

在你的情况下,我们得到:

void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
    __asm 
    {
        mov ecx,this
        mov Eax, y
        mov Ebx, [ecx]Graph._width //alias ecx to type 'Graph' and access member
        mul Ebx
        add Eax, x
        shl Eax, 2
        add Eax, [ecx]._buffer //access member with bound alias
        mov Edi, Eax
        mov Eax, c
        stosd
    }
}
Run Code Online (Sandbox Code Playgroud)