我正在使用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
答案 0 :(得分:1)
mov edi, m_bmp_data
只有当m_bmp_data是本地变量或全局变量时才能正常工作。该名称强烈建议它不是,很可能是C ++类的成员。这需要解除引用 this 指针,如下所示:
__asm {
mov eax, this;
mov edi, [eax + m_bmp_data];
// etc..
}
实际上编写这段代码没有意义,你也可以使用你找到的解决方法,编译器永远不会出错。