c ++ asm移动指针注册=访问冲突错误

时间:2012-12-01 11:29:54

标签: c++ winapi assembly inline-assembly

我正在使用asm insert来清除位图,就像这样创建:

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

asm insert( 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

1 个答案:

答案 0 :(得分:1)

    mov edi, m_bmp_data

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

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

实际上编写这段代码没有意义,你也可以使用你找到的解决方法,编译器永远不会出错。

相关问题