0

次のように作成されたビットマップをクリアするために 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 を使用します

4

1 に答える 1

2
    mov edi, m_bmp_data

これは、m_bmp_data がローカル変数またはグローバル変数である場合にのみ正しく機能します。名前はそうではないことを強く示唆しており、おそらく C++ クラスのメンバーです。次のように、 thisポインターを逆参照する必要があります。

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

実際にこのコードを書くことは意味がありません。あなたが見つけた回避策を使用することもできます.コンパイラは決してこれを間違えません.

于 2012-12-01T16:16:44.083 に答える