81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
| !	oneC_sum() - One complement`s checksum		Author: Kees J. Bot
 | |
| !								9 May 1995
 | |
| ! See RFC 1071, "Computing the Internet checksum"
 | |
| ! See also the C version of this code.
 | |
| 
 | |
| .sect .text
 | |
| 
 | |
| .define _oneC_sum
 | |
| 	.align	16
 | |
| _oneC_sum:
 | |
| 	push	ebp
 | |
| 	mov	ebp, esp
 | |
| 	push	esi
 | |
| 	push	edi
 | |
| 	movzx	eax, 8(ebp)		! Checksum of previous block
 | |
| 	mov	esi, 12(ebp)		! Data to compute checksum over
 | |
| 	mov	edi, 16(ebp)		! Number of bytes
 | |
| 
 | |
| 	xor	edx, edx
 | |
| 	xorb	cl, cl
 | |
| align:	test	esi, 3			! Is the data aligned?
 | |
| 	jz	aligned
 | |
| 	test	edi, edi
 | |
| 	jz	0f
 | |
| 	movb	dl, (esi)		! Rotate the first unaligned bytes
 | |
| 	dec	edi			! into the edx register
 | |
| 0:	inc	esi
 | |
| 	ror	edx, 8
 | |
| 	ror	eax, 8			! Rotate the checksum likewise
 | |
| 	addb	cl, 8			! Number of bits rotated
 | |
| 	jmp	align
 | |
| aligned:add	eax, edx		! Summate the unaligned bytes
 | |
| 	adc	eax, 0			! Add carry back in for one`s complement
 | |
| 
 | |
| 	jmp	add6test
 | |
| 	.align	16
 | |
| add6:	add	eax, (esi)		! Six times unrolled loop, see below
 | |
| 	adc	eax, 4(esi)
 | |
| 	adc	eax, 8(esi)
 | |
| 	adc	eax, 12(esi)
 | |
| 	adc	eax, 16(esi)
 | |
| 	adc	eax, 20(esi)
 | |
| 	adc	eax, 0
 | |
| 	add	esi, 24
 | |
| add6test:
 | |
| 	sub	edi, 24
 | |
| 	jae	add6
 | |
| 	add	edi, 24
 | |
| 
 | |
| 	jmp	add1test
 | |
| 	.align	16
 | |
| add1:	add	eax, (esi)		! while ((edi -= 4) >= 0)
 | |
| 	adc	eax, 0			!	eax += *esi++;
 | |
| 	add	esi, 4			! edi += 4;
 | |
| add1test:
 | |
| 	sub	edi, 4
 | |
| 	jae	add1
 | |
| 	add	edi, 4
 | |
| 
 | |
| 	jz	done			! Are there extra bytes?
 | |
| 	mov	edx, (esi)		! Load extra bytes in a full dword
 | |
| 	and	edx, mask-4(edi*4)	! Mask off excess
 | |
| 	add	eax, edx		! Add in the last bits
 | |
| 	adc	eax, 0
 | |
| done:	rol	eax, cl			! Undo the rotation at the beginning
 | |
| 	mov	edx, eax
 | |
| 	shr	eax, 16
 | |
|   o16	add	ax, dx			! Add the two words in eax to form
 | |
|   o16	adc	ax, 0			! a 16 bit sum
 | |
| 	pop	edi
 | |
| 	pop	esi
 | |
| 	pop	ebp
 | |
| 	ret
 | |
| 
 | |
| .sect .rom
 | |
| 	.align	4
 | |
| mask:	.data4	0x000000FF, 0x0000FFFF, 0x00FFFFFF
 | |
| 
 | |
| !
 | |
| ! $PchId: oneC_sum.ack.s,v 1.2 1996/03/12 19:33:51 philip Exp $
 | 
