C++ c++;asm将指针移动到寄存器=访问冲突错误

C++ c++;asm将指针移动到寄存器=访问冲突错误,c++,winapi,assembly,inline-assembly,C++,Winapi,Assembly,Inline Assembly,我正在使用asm insert清除位图,它是这样创建的: CreateDIBSection(m_dc, &bmpinfo, DIB_RGB_COLORS, (void **)&m_bmp_data, NULL, NULL); __asm { mov eax, this; mov edi, [eax + m_bmp_data]; // etc.. } asm插入(C++) 此代码引发访问冲突错误。但如果我这样做-一

我正在使用asm insert清除位图,它是这样创建的:

CreateDIBSection(m_dc, &bmpinfo, DIB_RGB_COLORS, (void **)&m_bmp_data, NULL, NULL);
    __asm {
        mov eax, this;
        mov edi, [eax + m_bmp_data];
        // etc..
    }
asm插入(C++

此代码引发访问冲突错误。但如果我这样做-一切正常:

BYTE* dest = m_bmp_data;
__asm
{
    mov edi, dest
...
这两种和平有什么区别

更新: 使用“mov edi,m_bmp_数据”将其翻译为“mov edi,10h”。为什么是10小时?与“mov edi,dest”一起翻译为“mov edi,dword ptr[dest]”。实际上,我不知道如何使用带整数值的memset,所以我只使用内联asm

    mov edi, m_bmp_data
只有当m_bmp_数据是局部或全局变量时,该选项才能正常工作。这个名字强烈地表明,它不是,在任何可能的情况下是C++类的成员。这需要取消对此指针的引用,如下所示:

CreateDIBSection(m_dc, &bmpinfo, DIB_RGB_COLORS, (void **)&m_bmp_data, NULL, NULL);
    __asm {
        mov eax, this;
        mov edi, [eax + m_bmp_data];
        // etc..
    }

实际上写这段代码是没有意义的,你最好使用你找到的解决方法,编译器从来不会出错。

第一节中的
m\u bmp\u数据是什么类型的?它是无符号字符*(或字节*)检查生成的汇编代码。顺便问一下,你有理由重新发明
memset
?您的编译器通常会很好地优化它。使用“mov edi,m_bmp_data”,它会转换为“mov edi,10h”。为什么是10小时?与“mov edi,dest”一起翻译为“mov edi,dword ptr[dest]”。实际上,我不知道如何使用带整数值的memset,所以我只使用内联asm