[comp.sys.ibm.pc] Fastest .ASM memory move

nelson@PEAR.ECS.CLARKSON.EDU (02/04/89)

What follows is the fastest way to move memory on an 80x86 machine.  After
writing it, I looked at Borland's movmem and memmove routines, and they
do essentially the same thing, except that they will move in reverse if
the source and destination overlap.
-russ


movemem:
;dos the same thing as "cld;rep movsb", only 50% faster.
;moves words instead of bytes, and handles the case of both addresses odd
;efficiently.  There is no way to handle one address odd efficiently.
;This routine always aligns the source address in the hopes that the
;destination address will also get aligned.
	cld
	jcxz	movemem_cnte		; If zero, we're done already.
	test	si,1			; Does source start on odd byte?
	jz	movemem_adre		; Go if not
	movsb				; Yes, move the first byte
	dec	cx			; Count tht byte
movemem_adre:
	mov	dx,cx			; save for later test
	shr	cx,1			; convert to word count
	rep	movsw			; Move the bulk as words
	jnc	movemem_cnte		; Go if the count was even
	movsb				; Move leftover last byte
movemem_cnte:
	ret