asm에서 byte를 한칸씩 건너뛰고 저장하도록 하려고 합니다.
글쓴이: cho's / 작성시간: 금, 2004/06/11 - 3:50오후
asm에서 byte를 한칸씩 건너뛰고 저장하도록 하려고 합니다.
즉 입력값의 배열이
src[12]라면 그 값중 반만 받아서 저장하려고 합니다.
c코드는 다음과 같습니다. 방법이 없을까요?
for(int i = 0; i < 12/2; i++) { dst[i] = src[i+1]; }
최대한 instruction을 줄이려고 mmx로 하고 있습니다.
싱글 instruction으로 바이트를 한칸씩 건너뛰고 저장할 방법은 없을까요?
어떻게 최적화를 해야될지 잘 모르겠습니다. 조언 부탁드립니다.
void half_size(unsigned char *pdst, unsigned char *psrc) { __asm { mov ecx, 8 ; Height test ecx,ecx jz _toend ;바로 앞전 연산 결과에 대한 플래그에서 zero 플래그가 세팅 되어 있으면(즉 0이면) _toend로 점프 합니다. push edi mov esi, psrc ; Get pointer to src mov edi, pdst ; Get pointer to dst mov eax, 0 dorepeat: movq mm0, [esi+eax*8] ; copy 8byte(64bit) ;;여기에서 1byte식 건너서 저장하도록 처리해야하는데 잘 모르겠네요. movq [edi+eax*8], mm0 inc eax loop dorepeat _toend: emms } }
Forums:
[답글] 다음과 같지 않을까요
asm에서 byte를 한칸씩 건너뛰고 저장하도록 하면 8byte가 16byte로 늘어날것 같군요..
가 되지 않을까요... [/code]
제가 최초 질문을 잘못올린것 같아서 다시 수정했습니다.
답글대로 해봤는데
dst[0] = 0;dst[1]= 1;dst[2] = 0;dst[3] = 2
이렇게 되더군요.
제 생각과 거꾸로 더라구요. 제가 질문을 모호하게 해서
원하는 값은
dst[0] = 0;dst[1] = 1;dst[2] = 2
이런데 소스의 offset이 하나씩 증가하는 것을 원하는 것입니다.
즉 다시 풀면
dst[0] = src[0];dst[1] = src[2];dst[2] = src[4]
읽어주셔서 고맙고요. 답글달아주셔서 고맙습니다. 종일 어셈과 씨름하네요.
...
Re: asm에서 byte를 한칸씩 건너뛰고 저장하도록 하려고 합니다.
원하시는것이 이것 아니었나요?
참고로 제가 위의 코드를 만들기위해 구글한 사이트는,
http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html#1011009
댓글 달기