[9] | 1 | ! oneC_sum() - One complement`s checksum Author: Kees J. Bot
|
---|
| 2 | ! 9 May 1995
|
---|
| 3 | ! See RFC 1071, "Computing the Internet checksum"
|
---|
| 4 | ! See also the C version of this code.
|
---|
| 5 |
|
---|
| 6 | .sect .text
|
---|
| 7 |
|
---|
| 8 | .define _oneC_sum
|
---|
| 9 | .align 16
|
---|
| 10 | _oneC_sum:
|
---|
| 11 | push ebp
|
---|
| 12 | mov ebp, esp
|
---|
| 13 | push esi
|
---|
| 14 | push edi
|
---|
| 15 | movzx eax, 8(ebp) ! Checksum of previous block
|
---|
| 16 | mov esi, 12(ebp) ! Data to compute checksum over
|
---|
| 17 | mov edi, 16(ebp) ! Number of bytes
|
---|
| 18 |
|
---|
| 19 | xor edx, edx
|
---|
| 20 | xorb cl, cl
|
---|
| 21 | align: test esi, 3 ! Is the data aligned?
|
---|
| 22 | jz aligned
|
---|
| 23 | test edi, edi
|
---|
| 24 | jz 0f
|
---|
| 25 | movb dl, (esi) ! Rotate the first unaligned bytes
|
---|
| 26 | dec edi ! into the edx register
|
---|
| 27 | 0: inc esi
|
---|
| 28 | ror edx, 8
|
---|
| 29 | ror eax, 8 ! Rotate the checksum likewise
|
---|
| 30 | addb cl, 8 ! Number of bits rotated
|
---|
| 31 | jmp align
|
---|
| 32 | aligned:add eax, edx ! Summate the unaligned bytes
|
---|
| 33 | adc eax, 0 ! Add carry back in for one`s complement
|
---|
| 34 |
|
---|
| 35 | jmp add6test
|
---|
| 36 | .align 16
|
---|
| 37 | add6: add eax, (esi) ! Six times unrolled loop, see below
|
---|
| 38 | adc eax, 4(esi)
|
---|
| 39 | adc eax, 8(esi)
|
---|
| 40 | adc eax, 12(esi)
|
---|
| 41 | adc eax, 16(esi)
|
---|
| 42 | adc eax, 20(esi)
|
---|
| 43 | adc eax, 0
|
---|
| 44 | add esi, 24
|
---|
| 45 | add6test:
|
---|
| 46 | sub edi, 24
|
---|
| 47 | jae add6
|
---|
| 48 | add edi, 24
|
---|
| 49 |
|
---|
| 50 | jmp add1test
|
---|
| 51 | .align 16
|
---|
| 52 | add1: add eax, (esi) ! while ((edi -= 4) >= 0)
|
---|
| 53 | adc eax, 0 ! eax += *esi++;
|
---|
| 54 | add esi, 4 ! edi += 4;
|
---|
| 55 | add1test:
|
---|
| 56 | sub edi, 4
|
---|
| 57 | jae add1
|
---|
| 58 | add edi, 4
|
---|
| 59 |
|
---|
| 60 | jz done ! Are there extra bytes?
|
---|
| 61 | mov edx, (esi) ! Load extra bytes in a full dword
|
---|
| 62 | and edx, mask-4(edi*4) ! Mask off excess
|
---|
| 63 | add eax, edx ! Add in the last bits
|
---|
| 64 | adc eax, 0
|
---|
| 65 | done: rol eax, cl ! Undo the rotation at the beginning
|
---|
| 66 | mov edx, eax
|
---|
| 67 | shr eax, 16
|
---|
| 68 | o16 add ax, dx ! Add the two words in eax to form
|
---|
| 69 | o16 adc ax, 0 ! a 16 bit sum
|
---|
| 70 | pop edi
|
---|
| 71 | pop esi
|
---|
| 72 | pop ebp
|
---|
| 73 | ret
|
---|
| 74 |
|
---|
| 75 | .sect .rom
|
---|
| 76 | .align 4
|
---|
| 77 | mask: .data4 0x000000FF, 0x0000FFFF, 0x00FFFFFF
|
---|
| 78 |
|
---|
| 79 | !
|
---|
| 80 | ! $PchId: oneC_sum.ack.s,v 1.2 1996/03/12 19:33:51 philip Exp $
|
---|