0

次のコードを同等の C コードに変換するのを手伝ってください。前もって感謝します。このモジュールは uint 値を返します。コードを以下に示します。

inline uint jpeg_decoder::huff_extend(uint i, int c)
{
  _asm
  {
    mov ecx, c
    mov eax, i
    cmp eax, [ecx*4+extend_mask]
    sbb edx, edx
    shl edx, cl
    adc eax, edx
  }
}
4

1 に答える 1

1

たぶん、あなたはsbbandのadc命令に慣れていないかもしれませ
sbb edx,edxキャリーが設定されている場合、-1に設定する一般的な構造ですedx。これは、キャリー フラグを無効にしてレジスタに移動する命令です (開発者マニュアルには記載されていません)。
シフト命令は、実際にシフトがある場合にのみ、キャリー ビットに再びシフトします。

したがって、関数は基本的に行っています:

if ( extend_mask[c] > i ) 
    return i + (c != 0);
else
    return i;
于 2012-05-21T09:18:31.617 に答える