Initial revision
This commit is contained in:
50
lib/i86/string/_memmove.s
Executable file
50
lib/i86/string/_memmove.s
Executable file
@@ -0,0 +1,50 @@
|
||||
! _memmove() Author: Kees J. Bot
|
||||
! 27 Jan 1994
|
||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
||||
|
||||
! void *_memmove(void *s1, const void *s2, size_t n)
|
||||
! Copy a chunk of memory. Handle overlap.
|
||||
!
|
||||
.sect .text
|
||||
.define __memmove, __memcpy
|
||||
__memmove:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push si
|
||||
push di
|
||||
mov di, 4(bp) ! String s1
|
||||
mov si, 6(bp) ! String s2
|
||||
mov cx, 8(bp) ! Length
|
||||
mov ax, di
|
||||
sub ax, si
|
||||
cmp ax, cx
|
||||
jb downwards ! if (s2 - s1) < n then copy downwards
|
||||
__memcpy:
|
||||
cld ! Clear direction bit: upwards
|
||||
cmp cx, #16
|
||||
jb upbyte ! Don't bother being smart with short arrays
|
||||
mov ax, si
|
||||
or ax, di
|
||||
testb al, #1
|
||||
jnz upbyte ! Bit 0 set, use byte copy
|
||||
upword: shr cx, #1
|
||||
rep movs ! Copy words
|
||||
adc cx, cx ! One more byte?
|
||||
upbyte:
|
||||
rep movsb ! Copy bytes
|
||||
done: mov ax, 4(bp) ! Absolutely noone cares about this value
|
||||
pop di
|
||||
pop si
|
||||
pop bp
|
||||
ret
|
||||
|
||||
! Handle bad overlap by copying downwards, don't bother to do word copies.
|
||||
downwards:
|
||||
std ! Set direction bit: downwards
|
||||
add si, cx
|
||||
dec si
|
||||
add di, cx
|
||||
dec di
|
||||
rep movsb ! Copy bytes
|
||||
cld
|
||||
jmp done
|
||||
Reference in New Issue
Block a user