【问题标题】:c++ asm move pointer to register = access violation errorc ++ asm将指针移动到寄存器=访问冲突错误
【发布时间】:2012-12-01 11:29:54
【问题描述】:

我正在使用 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

【问题讨论】:

  • 第一部分m_bmp_data的类型是什么?
  • 它是无符号字符*(或 BYTE*)
  • 检查生成的汇编代码。顺便问一下,你有理由重新发明memset吗?您的编译器通常可以很好地优化它。
  • 用“mov edi, m_bmp_data”翻译成“mov edi, 10h”。为什么是 10 小时? “mov edi, dest”翻译成“mov edi, dword ptr [dest]”。真的,我不知道如何将 memset 与整数值一起使用,所以我只使用内联 asm

标签: c++ winapi assembly inline-assembly


【解决方案1】:
    mov edi, m_bmp_data

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多