⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memmove.s

📁 Newlib 嵌入式 C库 标准实现代码
💻 S
字号:
/* * memmove routine for Z8000 * Copyright (C) 2004 Christian Groessler <chris@groessler.org> * * Permission to use, copy, modify, and distribute this file * for any purpose is hereby granted without fee, provided that * the above copyright notice and this notice appears in all * copies. * * This file is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *//* void *memmove(void *dest, const void *src, size_t length); */	name	"memmove.S"	.text	evenglobal	_memmove_memmove:#ifdef __Z8001__	segm#ifdef __STD_CALL__	ldl	rr6,rr14(#4)	ldl	rr4,rr14(#8)	ldl	rr2,rr14(#12)#else	pushl	@rr14,rr6#endif/* rr2  - length	(high word ignored) * rr4  - src * rr6  - dest */	testl	rr2	jr	z,finish/*  check for destructive overlap (src < dest && dest < src + length) */	cpl	rr6,rr4	jp	ule,memmove_entry	/* non-destructive, let memcpy do the work */	ldl	rr0,rr2	addl	rr0,rr4			/* rr0 = src + length */	cpl	rr0,rr6	jp	ult,memmove_entry	/* non-destructive, let memcpy do the work *//* set-up pointers to copy backwards, add (length - 1) */	addl	rr4,rr2			/* src + length */	addl	rr6,rr2			/* dest + length */	subl	rr4,#1	subl	rr6,#1/* check alignment */	bitb	rl7,#0		/* odd destination address? */	jr	z,testsrc	bitb	rl5,#0		/* odd source address? */	jr	z,odd_copy	jr	even_copytestsrc:	bitb	rl5,#0	jr	nz,odd_copy	/* src even, dest odd */	lddb	@rr6,@rr4,r3	jr	ov,finish	/* jump if r5 is zero now *//* copy words */even_copy:	ld	r2,r3			/* remember length */	srl	r3,#1/*	jr	z,no_words	   it cannot be zero here */	dec	r5,#1	dec	r7,#1	lddr	@rr6,@rr4,r3no_words:	bitb	rl2,#0		/* odd length? */	jr	z,finish	inc	r5,#1	inc	r7,#1	lddb	@rr6,@rr4,r2	/* yes, copy last byte */	jr	finish/* copy bytes */odd_copy:	lddrb	@rr6,@rr4,r3finish:#ifdef __STD_CALL__	ldl	rr6,rr14(#4)#else	popl	rr2,@rr14#endif#else		/* above Z8001, below Z8002 */	unsegm#ifdef __STD_CALL__	ld	r7,r15(#2)	ld	r6,r15(#4)	ld	r5,r15(#6)#else	ld	r2,r7		/* buffer pointer return value */#endif/* r5  - length * r6  - src * r7  - dest */	test	r5	jr	z,finish/*  check for destructive overlap (src < dest && dest < src + length) */	cp	r7,r6	jp	ule,memmove_entry	/* non-destructive, let memcpy do the work */	ld	r0,r5	add	r0,r6			/* r0 = src + length */	cp	r0,r7	jp	ult,memmove_entry	/* non-destructive, let memcpy do the work *//* set-up pointers to copy backwards, add (length - 1) */	add	r6,r5			/* src + length */	add	r7,r5			/* dest + length */	dec	r6,#1	dec	r7,#1/* check alignment */	bitb	rl7,#0		/* odd destination address? */	jr	z,testsrc	bitb	rl6,#0		/* odd source address? */	jr	z,odd_copy	jr	even_copytestsrc:	bitb	rl6,#0	jr	nz,odd_copy	/* src even, dest odd */	lddb	@r7,@r6,r5	jr	ov,finish	/* jump if r5 is zero now *//* copy words */even_copy:	ld	r4,r5		/* remember length */	srl	r5,#1/*	jr	z,no_words	   it cannot be zero here */	dec	r6,#1	dec	r7,#1	lddr	@r7,@r6,r5no_words:	bitb	rl4,#0		/* odd length? */	jr	z,finish	inc	r6,#1	inc	r7,#1	lddb	@r7,@r6,r4	/* yes, copy last byte */	jr	finish/* copy bytes */odd_copy:	lddrb	@r7,@r6,r5finish:#ifdef __STD_CALL__	ld	r7,r15(#2)#endif#endif	/* Z8002 */	ret	.end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -