Я использую 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
mov edi, m_bmp_data
Это будет работать правильно только тогда, когда m_bmp_data является локальной или глобальной переменной. Название настоятельно предполагает, что это не так, по всей вероятности, является членом класса C ++. Что требует разыменования этот указатель, вот так:
__asm {
mov eax, this;
mov edi, [eax + m_bmp_data];
// etc..
}
На самом деле написание этого кода не имеет смысла, вы также можете использовать найденный обходной путь, компилятор никогда не ошибается.
Других решений пока нет …