asmintro.chm, Single DWORD copy, 2 DWORD copy each iteration

Started by bolzano_1989, October 18, 2011, 04:34:44 PM

Previous topic - Next topic

bolzano_1989

In Basic Loop Design section of asmintro.chm of masm32, there're some lines of code:

Single DWORD copy.

      mov esi, src
      mov edi, dst
      mov ecx, count  ; count in ecx
      shr ecx, 2      ; divide by 4

    label:
      mov eax, [esi]
      add esi, 4

      mov [edi], eax
      add edi, 4
      dec ecx
      jnz label


I couldn't understand what is "count in ecx" and why we need to divide this value by 4 in:
Quoteshr ecx, 2

Unrolled to perform 2 DWORD copies each iteration.

      mov esi, src
      mov edi, dst
      mov ecx, count      ; count in ecx
      shr ecx, 3          ; divide by 8

    label:
      mov eax, [esi]      ; read 1st DWORD
      mov ebx, [esi + 4]  ; read 2nd DWORD
      mov [edi], eax      ; write 1st DWORD
      mov [edi + 4], ebx  ; write 2nd DWORD
      add esi, 8          ; add 8 to esi

  add edi, 8          ; add 8 to edi
      dec ecx
      jnz label


I couldn't understand what is "count in ecx" and why we need to divide this value by 8 in:
Quoteshr ecx, 3

Could you explain those things to me  :bg ?

jj2007

Usually you call, for example, a memcopy proc by passing two pointers (src, destination) and a byte count. If every "action" inside your loop copies a DWORD, i.e. 4 bytes, then you must perform less loops.

dedndave

the initial count value is the number of bytes
this needs to be converted to the number of loop iterations
for the first loop, 4 bytes are handled in each pass (a dword)
for the second loop, 8 bytes are handled in each pass (2 dwords)
so, the initial count value is shifted to the right, which divides it by powers of 2

bolzano_1989

Thank you, dedndave and jj2007 :U.
"count in ecx" is the number of bytes to be copied :bg .