winapi — c ++ asm переместить указатель на регистр = ошибка нарушения прав доступа

Я использую 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

Решение

    mov edi, m_bmp_data

Это будет работать правильно только тогда, когда m_bmp_data является локальной или глобальной переменной. Название настоятельно предполагает, что это не так, по всей вероятности, является членом класса C ++. Что требует разыменования этот указатель, вот так:

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

На самом деле написание этого кода не имеет смысла, вы также можете использовать найденный обходной путь, компилятор никогда не ошибается.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]