2012-05-17 4 views
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 
    } 
} 
+0

감사합니다. 내가 조립 코드에 익숙하지 않아서 아무 것도 시도하지 않았다. 나는 cx 변수를 ecx 레지스터에 넣을 변수를 이해할 수 있지만 eax 등록 할 수있는 다른 레지스터를 왜 내가 알아낼 수없는 및이 방법을 값을 반환 할 수 있습니다. 또한 내가 알아낼 수 없습니다. 도와주세요. . –

+4

[Intel Architecture Software Developer 's Manual] (http://download.intel.com/design/intarch/manuals/24319101.pdf)은 x86 어셈블리에 대한 표준 참조 문서입니다. 이를 사용하여이 어셈블리 코드를 이해하고 이해할 수없는 부분에 대한 * 구체적인 * 질문으로 돌아가십시오. –

+1

@ Li-aungYip 자, 그 질문은 매우 구체적입니다. 그리고 실제로 그것은 어렵지 않고 5 분 안에 답할 수 있습니다 (아마도 당신을 위해서가 아니라, 그래서 영리한 사람들이 많이 있습니다). 따라서 전혀 도움이되지 않는 기술 참조에 대한 링크를 게시 할 필요가 없습니다 – hirschhornsalz

답변

1

은 아마 당신은 대출 빼기 및 캐리에 추가되는 sbbadc 지침에 익숙하지 않은.
sbb edx,edx은 캐리가 설정된 경우 edx을 -1로 설정하는 일반적인 구조입니다. 캐리 플래그를 무효화하고이를 레지스터로 이동하는 명령입니다 (개발자 설명서에서 알려주지 않음).
실제로 시프트가있는 경우에만 시프트 인스트럭션이 캐리 비트로 다시 시프트됩니다.

그래서 기능은 기본적으로하고있다 : 답장을 보내

if (extend_mask[c] > i) 
    return i + (c != 0); 
else 
    return i; 
+0

대단히 감사합니다. 그것은 나를 도와 줄 것입니다. –