0

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

CreateDIBSection(m_dc, &bmpinfo, DIB_RGB_COLORS, (void **)&m_bmp_data, NULL, NULL);

asm 插入 ( C++ )

int c = RGB32(color.r, color.g, color.b);

int length = m_width * m_height;

__asm
{
    mov edi, m_bmp_data
    mov ecx, length
    mov eax, c
    rep stosd
}

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

BYTE* dest = m_bmp_data;
__asm
{
    mov edi, dest
...

这个和解有什么区别?

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

4

1 回答 1

2
    mov edi, m_bmp_data

只有当 m_bmp_data 是本地或全局变量时,它才能正常工作。这个名字强烈暗示它不是,很可能是 C++ 类的成员。这需要取消引用this指针,如下所示:

    __asm {
        mov eax, this;
        mov edi, [eax + m_bmp_data];
        // etc..
    }

实际上编写此代码没有意义,您不妨使用您找到的解决方法,编译器永远不会出错。

于 2012-12-01T16:16:44.083 回答