user: 提供的汇编代码用C语言表示会是什么样子：

```asm
<memmove>:
  endbr64
  push   %rbx
  mov    %rdi,%r8
  mov    %rdx,%rax
  cmp    %rdi,%rsi
  jb     L77
  mov    %rsi,%rdi
  mov    %r8,%rcx
  mov    %rsi,%rdx
  xor    %r8,%rdx
  test   $0x7,%dl
  jne    L152
  test   %rax,%rax
  je     L127
  test   $0x7,%sil
  je     L53
L35:
  movzbl (%rdi),%edx
  mov    %dl,(%rcx)
  add    $0x1,%rdi
  add    $0x1,%rcx
  sub    $0x1,%rax
  je     L127
  test   $0x7,%dil
  jne    L35
L53:
  cmp    $0x7,%rax
  jbe    L57
  lea    -0x8(%rax),%r11
  lea    0x8(%rdi),%rbx
  mov    %r11,%r9
  and    $0xfffffffffffffff8,%r9
  add    %rbx,%r9
  mov    %rdi,%rdx
  mov    %rcx,%r10
  sub    %rdi,%r10
L181:
  mov    (%rdx),%rsi
  mov    %rsi,(%r10,%rdx,1)
  add    $0x8,%rdx
  cmp    %r9,%rdx
  jne    L181
  mov    %r11,%rdx
  and    $0xfffffffffffffff8,%rdx
  lea    (%rdx,%rbx,1),%rdi
  lea    0x8(%rdx,%rcx,1),%rcx
  and    $0x7,%eax
L152:
  test   %rax,%rax
  je     L127
L57:
  add    %rdi,%rax
  mov    %rdi,%rdx
  sub    %rdi,%rcx
L150:
  movzbl (%rdx),%esi
  mov    %sil,(%rcx,%rdx,1)
  add    $0x1,%rdx
  cmp    %rdx,%rax
  jne    L150
L127:
  mov    %r8,%rax
  pop    %rbx
  ret
L77:
  lea    (%rsi,%rdx,1),%rdx
  lea    (%rdi,%rax,1),%rdi
  mov    %rdx,%rcx
  xor    %rdi,%rcx
  test   $0x7,%cl
  jne    L59
  test   %rax,%rax
  je     L127
  test   $0x7,%dl
  je     L109
L138:
  sub    $0x1,%rdx
  sub    $0x1,%rdi
  movzbl (%rdx),%ecx
  mov    %cl,(%rdi)
  sub    $0x1,%rax
  je     L127
  test   $0x7,%dl
  jne    L138
L109:
  cmp    $0x7,%rax
  jbe    L76
  lea    -0x8(%rax),%rcx
  mov    %rcx,%r11
  shr    $0x3,%r11
  lea    -0x8(%rdx),%rbx
  and    $0xfffffffffffffff8,%rcx
  mov    %rbx,%r10
  sub    %rcx,%r10
  mov    %rdx,%rcx
L141:
  sub    $0x8,%rcx
  mov    (%rcx),%r9
  lea    (%rcx,%rdi,1),%rsi
  sub    %rdx,%rsi
  mov    %r9,(%rsi)
  cmp    %r10,%rcx
  jne    L141
  mov    %r11,%rcx
  neg    %rcx
  shl    $0x3,%rcx
  lea    (%rcx,%rbx,1),%rdx
  lea    -0x8(%rdi,%rcx,1),%rdi
  and    $0x7,%eax
L59:
  test   %rax,%rax
  je     L127
L76:
  mov    %rdx,%r9
  sub    %rax,%r9
  mov    %rdx,%rax
L106:
  sub    $0x1,%rax
  movzbl (%rax),%esi
  lea    (%rax,%rdi,1),%rcx
  sub    %rdx,%rcx
  mov    %sil,(%rcx)
  cmp    %r9,%rax
  jne    L106
  jmp    L127
```

assistant: ```c
void *memmove(void *s1, const void *s2, size_t n) {
  uintptr_t from = (uintptr_t)s2;
  uintptr_t to = (uintptr_t)s1;
  if (to <= from) {
    if (((from ^ to) & (sizeof(uintptr_t) - 1)) == 0) {
      while (n != 0 && ((from & (sizeof(uintptr_t) - 1)) != 0)) {
        *(char *)to = *(const char *)from;
        from++;
        to++;
        n--;
      }
      while (n >= sizeof(uintptr_t)) {
        *(uintptr_t *)to = *(const uintptr_t *)from;
        from += sizeof(uintptr_t);
        to += sizeof(uintptr_t);
        n -= sizeof(uintptr_t);
      }
    }
    while (n != 0) {
      *(char *)to = *(const char *)from;
      from++;
      to++;
      n--;
    }
  } else {
    from += n;
    to += n;
    if (((from ^ to) & (sizeof(uintptr_t) - 1)) == 0) {
      while (n != 0 && ((from & (sizeof(uintptr_t) - 1)) != 0)) {
        from--;
        to--;
        *(char *)to = *(const char *)from;
        n--;
      }
      while (n >= sizeof(uintptr_t)) {
        from -= sizeof(uintptr_t);
        to -= sizeof(uintptr_t);
        *(uintptr_t *)to = *(const uintptr_t *)from;
        n -= sizeof(uintptr_t);
      }
    }
    while (n != 0) {
      from--;
      to--;
      *(char *)to = *(const char *)from;
      n--;
    }
  }
  return s1;
}
```