Initial revision
This commit is contained in:
44
lib/i386/string/memset.s
Executable file
44
lib/i386/string/memset.s
Executable file
@@ -0,0 +1,44 @@
|
||||
! 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
|
||||
Reference in New Issue
Block a user