asm에서 byte를 한칸씩 건너뛰고 저장하도록 하려고 합니다.

cho's의 이미지

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
	}
}
ryoo1105의 이미지

asm에서 byte를 한칸씩 건너뛰고 저장하도록 하면 8byte가 16byte로 늘어날것 같군요..

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 

    ; ------------------------------------
     pxor mm2, mm2
    ; ------------------------------------

dorepeat: 
      movq   mm0, [esi+eax*8]   ; copy 8byte(64bit) 

     ; ------------------------------------------------
      mov    mm1, mm0

      punpcklbw mm0, mm2
      punpckhbw mm1, mm2

      movq   [edi+eax*16], mm0 
      movq   [edi+eax*16+8], mm1
      inc eax 
     ; ---------------------------------------------------
      loop dorepeat 
_toend: 


   emms 
   } 
} 

가 되지 않을까요... [/code]

cho&#039;s의 이미지

답글대로 해봤는데
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]

읽어주셔서 고맙고요. 답글달아주셔서 고맙습니다. 종일 어셈과 씨름하네요.
...

hb_kim의 이미지

dorepeat:
		movq	mm0, [esi+eax*16] ; copy 8byte(64bit)
		movq	mm1, [esi+eax*16+8] ; copy 8byte(64bit)
		packsswb mm1, mm0
		movq       [edi+eax*8], mm1
		inc           eax
		loop dorepeat

원하시는것이 이것 아니었나요?

참고로 제가 위의 코드를 만들기위해 구글한 사이트는,
http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html#1011009

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.