69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
| !	oneC_sum() - One complement`s checksum		Author: Kees J. Bot
 | |
| !								23 May 1998
 | |
| ! See RFC 1071, "Computing the Internet checksum"
 | |
| ! See also the C version of this code.
 | |
| 
 | |
| .text
 | |
| 
 | |
| .define _oneC_sum
 | |
| 	.align	4
 | |
| _oneC_sum:
 | |
| 	push	bp
 | |
| 	mov	bp, sp
 | |
| 	push	si
 | |
| 	push	di
 | |
| 	mov	ax, 4(bp)		! Checksum of previous block
 | |
| 	mov	si, 6(bp)		! Data to compute checksum over
 | |
| 	mov	di, 8(bp)		! Number of bytes
 | |
| 
 | |
| 	xor	dx, dx
 | |
| 	xorb	cl, cl
 | |
| align:	test	si, #1			! Is the data aligned?
 | |
| 	jz	aligned
 | |
| 	test	di, di
 | |
| 	jz	0f
 | |
| 	movb	dh, (si)		! First unaligned byte in high half of
 | |
| 	dec	di			! the dx register, i.e. rotate 8 bits
 | |
| 0:	inc	si
 | |
| 	movb	cl, #8			! Number of bits "rotated"
 | |
| 	ror	ax, cl			! Rotate the checksum likewise
 | |
| aligned:add	ax, dx			! Summate the unaligned byte
 | |
| 	adc	ax, #0			! Add carry back in for one`s complement
 | |
| 
 | |
| 	jmp	add6test
 | |
| 	.align	4
 | |
| add6:	add	ax, (si)		! Six times unrolled loop, see below
 | |
| 	adc	ax, 2(si)
 | |
| 	adc	ax, 4(si)
 | |
| 	adc	ax, 6(si)
 | |
| 	adc	ax, 8(si)
 | |
| 	adc	ax, 10(si)
 | |
| 	adc	ax, #0
 | |
| 	add	si, #12
 | |
| add6test:
 | |
| 	sub	di, #12
 | |
| 	jae	add6
 | |
| 	add	di, #12
 | |
| 
 | |
| 	jmp	add1test
 | |
| 	.align	4
 | |
| add1:	add	ax, (si)		! while ((di -= 2) >= 0)
 | |
| 	adc	ax, #0			!	ax += *si++;
 | |
| 	add	si, #2			! di += 2;
 | |
| add1test:
 | |
| 	sub	di, #2
 | |
| 	jae	add1
 | |
| 	add	di, #2
 | |
| 
 | |
| 	jz	done			! Is there an extra byte?
 | |
| 	movb	dl, (si)		! Load extra byte in word
 | |
| 	xorb	dh, dh
 | |
| 	add	ax, dx			! Add in the last bits
 | |
| 	adc	ax, #0
 | |
| done:
 | |
| 	rol	ax, cl			! Undo the rotation at the beginning
 | |
| 	pop	di
 | |
| 	pop	si
 | |
| 	pop	bp
 | |
| 	ret
 | 
