リスト4●リスト3の処理を自分でアセンブリ言語で書き直した
プリフェッチ命令を使って,メモリー・アクセスの高速化も図った

void CChildView::OnEditBwAsm()
{
    int nMaxX = m_Image.GetWidth();   //画像の横方向の画素数(幅)
    int nMaxY = m_Image.GetHeight();  //画像の縦方向の画素数(高さ)

    MyRGB* data = (MyRGB*)malloc( sizeof(MyRGB) * nMaxX * nMaxY );

    <画素を抜き出す処理・省略>

    //モノクロ変換
    int cnt = nMaxX * nMaxY;  //繰り返し回数
    __asm
    {
        push    esi
        push    edi

        mov        ecx, cnt
        mov        esi, data

$loop:
        mov        eax, [esi].G
        mov        edx, [esi].R
        lea        ebx, [eax*2 + eax]  ;ebx = G*3
        lea        edi, [edx*2 + edx]  ;edi = R*3
        mov        eax, [esi].B
        lea        edx, [ebx*2 + edi]  ;edx = G*6 + R*3
        add        eax, edx            ;eax = G*6 + R*3 + B
        mov        ebx, 10
        xor        edx, edx
        div        ebx                 ;eax = (G*6 + R*3 + B) / 10
        mov        [esi].Result, eax
        add        esi, 16             ;次の画素のアドレス

        lea        ebx, [esi+16]
        prefetcht0 [ebx]           ;すべてのキャッシュにプリフェッチ

        dec        ecx
        jnz        $loop

        pop        edi
        pop        esi
    }

    <画像に反映する処理・省略>

}