format elf64 section '.text' executable ; x64fastcall void* memset(void* dest, int data, size_t count) ; ; Input: (void* rcx, int rdx, size_t r8) ; Output: void* rax ; Clobbers: r10, flags public memset memset: mov rax, rcx lea r10, [rcx+r8] memset_loop: mov byte[rcx], dl inc rcx cmp rcx, r10 jne memset_loop ret ; x64fastcall void* memmove(void* dest, const void* src, size_t count) ; ; Input: (void* rcx, void* rdx, size_t r8) ; Output: void* rax ; Clobbers: r9, r10, r11, flags public memmove memmove: mov rax, rcx lea r10, [rcx+r8] ; past-the-end for *dest lea r11, [rdx+r8] ; past-the-end for *src cmp rdx, rcx je memmove_end ; return if move buffers are the same jl memmove_back ; *src < *dest: overlaps, copy backward memmove_front: ; *src > *dest: overlaps, copy forward mov r9b, byte[rdx] mov byte[rcx], r9b inc rcx inc rdx cmp rcx, r10 jne memmove_front jmp memmove_end memmove_back: dec r10 dec r11 mov r9b, byte[r11] mov byte[r10], r9b cmp rcx, r10 jne memmove_back memmove_end: ret