|
|
1.1 ! root 1: ////////// ! 2: / libc/string/i386/memmove.s ! 3: / i386 C string library. ! 4: / ANSI 4.11.2.2. ! 5: ////////// ! 6: ! 7: //////// ! 8: / void * ! 9: / memmove(void *To, void *From, size_t Count) ! 10: / ! 11: / Copy a block of memory from one ! 12: / place in physical address space to ! 13: / another place in physical address space. ! 14: / Copy backwards if the source precedes the destination in memory. ! 15: / Forward copy uses memcpy(), q.v. ! 16: / Backward copy does byte-by-byte copy rather than trying to use dwords. ! 17: //////// ! 18: ! 19: To .equ 12 / destination ! 20: From .equ To+4 / source ! 21: Count .equ From+4 / byte count ! 22: ! 23: .globl memmove ! 24: .globl _memcpy ! 25: ! 26: memmove: ! 27: push %esi ! 28: push %edi ! 29: ! 30: movl %edi, To(%esp) / Load EDI with destination. ! 31: movl %eax, %edi / Return value to EAX. ! 32: movl %ecx, Count(%esp) / Pick up byte count. ! 33: jecxz ?done / No work. ! 34: movl %esi, From(%esp) / Load ESI with source. ! 35: cmpl %esi, %edi / Compare pointers. ! 36: jz ?done / From == To. ! 37: ja _memcpy / From > To, copy forward. ! 38: addl %esi, %ecx / From < To, ! 39: addl %edi, %ecx / copy backward. ! 40: decl %esi / Find end of From ! 41: decl %edi / and end of To. ! 42: std / Set flag for backward copy. ! 43: rep / Copy ! 44: movsb / bytes. ! 45: cld / Clear direction flag. ! 46: ! 47: ?done: ! 48: pop %edi ! 49: pop %esi ! 50: ret ! 51: ! 52: / end of libc/string/i386/memmove.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.