我正在使用 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
最佳答案
mov edi, m_bmp_data
只有当 m_bmp_data 是局部或全局变量时才能正常工作。这个名字强烈暗示它不是,很可能是 C++ 类的成员。这需要取消引用 this 指针,如下所示:
__asm {
mov eax, this;
mov edi, [eax + m_bmp_data];
// etc..
}
实际上写这段代码没有意义,你还不如使用你找到的解决方法,编译器永远不会出错。
关于c++ asm 将指针移动到寄存器 = 访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658980/