home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter21 / l21-5.asm < prev   
Assembly Source File  |  1997-06-18  |  2KB  |  42 lines

  1. ; Calculates TCP/IP (16-bit carry-wrapping) checksum for buffer
  2. ;  starting at ESI, of length ECX words.
  3. ; Returns checksum in AX.
  4. ; High word of EAX, EBX, ECX, EDX, and ESI destroyed.
  5. ; All cycle counts assume 32-bit protected mode.
  6. ; Assumes buffer starts on a dword boundary, is a dword multiple
  7. ;  in length, and length > 0.
  8.  
  9.         sub     eax,eax         ;initialize the checksum
  10.         shr     ecx,2           ;we'll do two dwords per loop
  11.         jnc     short noodddword ;is there an odd dword in buffer?
  12.         mov     eax,[esi]       ;checksum the odd dword
  13.         jz      short ckloopdone ;no, done
  14.         add     esi,4           ;point to the next dword
  15. noodddword:
  16.         mov     edx,[esi]       ;preload the first dword
  17.         mov     ebx,[esi+4]     ;preload the second dword
  18.         dec     ecx             ;we'll do 1 checksum outside the loop
  19.         jz      short ckloopend ;only 1 checksum to do
  20.         add     esi,8           ;point to the next dword
  21.  
  22. ckloop:
  23.         add     eax,edx         ;cycle 1 U-pipe
  24.         mov     edx,[esi]       ;cycle 1 V-pipe
  25.         adc     eax,ebx         ;cycle 2 U-pipe
  26.         mov     ebx,[esi+4]     ;cycle 2 V-pipe
  27.         adc     eax,0           ;cycle 3 U-pipe
  28.         add     esi,8           ;cycle 3 V-pipe
  29.         dec     ecx             ;cycle 4 U-pipe
  30.         jnz     ckloop          ;cycle 4 V-pipe
  31.  
  32. ckloopend:
  33.         add     eax,edx         ;checksum the last two dwords
  34.         adc     eax,ebx
  35.         adc     eax,0
  36. ckloopdone:
  37.         mov     edx,eax         ;compress the 32-bit checksum
  38.         shr     edx,16          ; into a 16-bit checksum
  39.         add     ax,dx
  40.         adc     eax,0
  41.  
  42.