|
|
1.1 ! root 1: ////////// ! 2: / libc/string/i386/memccpy.s ! 3: / i386 C string library. ! 4: / Not in ANSI C standard. ! 5: ////////// ! 6: ! 7: //////// ! 8: / char * ! 9: / memccpy(char *dest, char *src, int c, size_t n) ! 10: / ! 11: / Copy characters from src to dest, ! 12: / stopping after the first occurrence of character c has been copied ! 13: / or after n characters have been copied. ! 14: / Return a pointer to the character after the copy of c in dest, ! 15: / or NULL if c is not found in the first n characters of src. ! 16: ///////// ! 17: ! 18: dest .equ 12 ! 19: src .equ dest+4 ! 20: c .equ src+4 ! 21: n .equ c+4 ! 22: ! 23: .globl memccpy ! 24: ! 25: memccpy: ! 26: push %esi ! 27: push %edi ! 28: ! 29: movb %al, c(%esp) / c to AL ! 30: movl %edx, n(%esp) / n to EDX ! 31: movl %edi, src(%esp) / src to EDI ! 32: movl %esi, %edi / save src in ESI ! 33: movl %ecx, %edx / count to ECX ! 34: jecxz ?copy / n is 0, skip looking for c, return NULL ! 35: cld ! 36: repne ! 37: scasb / Find first c in src ! 38: jne ?copy / Not found, just copy and return NULL ! 39: subl %edx, %ecx / Adjust count for copy ! 40: movl %ecx, %edi / pointer past c in src ! 41: subl %ecx, %esi / offset to char after c in src ! 42: add %ecx, dest(%esp) / pointer to char after c in dest ! 43: ! 44: / The return value is in ECX, the count in EDX. ! 45: ?copy: ! 46: movl %eax, %ecx / Return value to EAX ! 47: movl %esi, %edi ! 48: movl %edi, dest(%esp) ! 49: movl %ecx, %edx / Count to ECX ! 50: rep ! 51: movsb / Copy ! 52: ! 53: pop %edi ! 54: pop %esi ! 55: ret ! 56: ! 57: / end of libc/string/i386/memccpy.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.