memmove.s

来自「newos is new operation system」· S 代码 · 共 89 行

S
89
字号
/*** Copyright 2003, Fred Ferrie. All rights reserved.** Distributed under the terms of the NewOS License.*/.text/*** ----------------- memmove -------------------** input: r3 = dst mem offset (untouched)** input: r4 = src mem offset (untouched)** input: r5 = number of bytes (unsigned)** note: overlap protection provided** note: destroys r5, r6, r7, ctr, cr0, cr1, cr2** ---------------------------------------------*/.globl memmovememmove:		cmpw			cr1,r3,r4		beqlr			cr1					; // dst and src are the same		cmpwi			r5,0		beqlr								; // nothing to move				; /* count number of bytes in head/tail */		clrlwi.			r7,r5,30		cmpw			cr2,r5,r7				; /* moving up or down? */		blt				cr1,memmove_moving_down				; /* moving up (dst < src) */		subi			r6,r5,1				; // init a loop counter		; // if there is no bytes in tail, move words only		beq				moving_up_move_words				; /* move tail (1 to 3 bytes) by bytes */		mtctr			r7					; // bytes in tail -> count register (ctr)moving_up_bytes_loop:		lbzx			r7,r4,r6		stbx			r7,r3,r6		subi			r6,r6,1		bdnz			moving_up_bytes_loop				; /* number of bytes < 4 ? */		beqlr			cr2		moving_up_move_words:		; /* move words up */		subi			r6,r6,3				; // patch a loop counter		srawi			r5,r5,2				; // r5 is a number of words		mtctr			r5					; // number of words -> count register (ctr)moving_up_words_loop:		lwzx			r7,r4,r6		stwx			r7,r3,r6		subi			r6,r6,4		bdnz			moving_up_words_loop				blr		; /* moving down (src < dst), acts like memcpy */memmove_moving_down:		li				r6,0				; // init a loop counter		; // if there is no bytes in head, move words only		beq				moving_down_move_words				; /* move head (1 to 3 bytes) by bytes */		mtctr			r7					; // bytes in head -> count register (ctr)moving_down_bytes_loop:		lbzx			r7,r4,r6		stbx			r7,r3,r6		addi			r6,r6,1		bdnz			moving_down_bytes_loop				; /* number of bytes < 4 ? */		beqlr			cr2		moving_down_move_words:		; /* move words down */		; //			current loop counter is in r6		srawi			r5,r5,2				; // r5 is a number of words		mtctr			r5					; // number of words -> count register (ctr)moving_down_words_loop:		lwzx			r7,r4,r6		stwx			r7,r3,r6		addi			r6,r6,4		bdnz			moving_down_words_loop				blr

⌨️ 快捷键说明

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