minix/lib/i386/string/memset.s
2005-04-21 14:53:53 +00:00

45 lines
1,015 B
ArmAsm
Executable file

! memset() Author: Kees J. Bot
! 2 Jan 1994
.sect .text; .sect .rom; .sect .data; .sect .bss
! void *memset(void *s, int c, size_t n)
! Set a chunk of memory to the same byte value.
!
.sect .text
.define _memset
.align 16
_memset:
push ebp
mov ebp, esp
push edi
mov edi, 8(ebp) ! The string
movzxb eax, 12(ebp) ! The fill byte
mov ecx, 16(ebp) ! Length
cld
cmp ecx, 16
jb sbyte ! Don't bother being smart with short arrays
test edi, 1
jnz sbyte ! Bit 0 set, use byte store
test edi, 2
jnz sword ! Bit 1 set, use word store
slword: movb ah, al
mov edx, eax
sal edx, 16
or eax, edx ! One byte to four bytes
shrd edx, ecx, 2 ! Save low two bits of ecx in edx
shr ecx, 2
rep
stos ! Store longwords.
shld ecx, edx, 2 ! Restore low two bits
sword: movb ah, al ! One byte to two bytes
shr ecx, 1
rep
o16 stos ! Store words
adc ecx, ecx ! One more byte?
sbyte: rep
stosb ! Store bytes
done: mov eax, 8(ebp) ! Return some value you have no need for
pop edi
pop ebp
ret