|
|
1.1 ! root 1: ////////// ! 2: / libc/string/i386/strcpy.s ! 3: / i386 C string library. ! 4: / ANSI 4.11.2.3, 4.11.2.4. ! 5: ////////// ! 6: ! 7: ////////// ! 8: / char * ! 9: / strcpy(char *To, char *From) ! 10: / Copy From to To until NUL. ! 11: / ! 12: / char * ! 13: / strncpy(char *To, char *From, size_t Count) ! 14: / Copy up to Count bytes from From to To. ! 15: / NUL-pad the output if Count not reached. ! 16: ////////// ! 17: ! 18: To .equ 12 ! 19: From .equ To+4 ! 20: Count .equ From+4 ! 21: ! 22: .globl strcpy ! 23: .globl strncpy ! 24: ! 25: strncpy: ! 26: movl %ecx, Count-8(%esp) / Count to ECX ! 27: jecxz quit / Copy nothing ! 28: subl %edx, %edx / EDX zero to indicate strncpy ! 29: jmp strcpy0 ! 30: ! 31: strcpy: ! 32: movl %ecx, $-1 / max Count to ECX ! 33: movl %edx, %ecx / EDX nonzero to indicate strcpy ! 34: ! 35: strcpy0: ! 36: push %esi ! 37: push %edi ! 38: ! 39: movl %esi, From(%esp) / From address to ESI ! 40: movl %edi, To(%esp) / To address to EDI ! 41: cld ! 42: ! 43: ?loop: ! 44: lodsb / From character to AL ! 45: stosb / and stored through To ! 46: orb %al, %al ! 47: loopne ?loop / Continue if AL!=0 && ECX!=0 ! 48: orl %edx, %edx ! 49: jnz ?done / Done if strcpy ! 50: rep / Store more NULs ! 51: stosb / (does nothing if ECX==0) ! 52: ! 53: ?done: ! 54: pop %edi ! 55: pop %esi ! 56: ! 57: quit: ! 58: movl %eax, To-8(%esp) / Return the destination ! 59: ret ! 60: ! 61: / end of libc/string/i386/strcpy.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.