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 $
|
---|