user: 下面的汇编指令对应的C源代码是什么：

```asm
<strlcpy>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x48(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  test   %rax,%rax
  je     L4
  mov    -0x40(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  xor    %rdx,%rax
  and    $0x7,%eax
  test   %rax,%rax
  jne    L19
  jmp    L23
L117:
  subq   $0x1,-0x48(%rbp)
  addq   $0x1,-0x40(%rbp)
  addq   $0x1,-0x38(%rbp)
L23:
  mov    -0x40(%rbp),%rax
  and    $0x7,%eax
  test   %rax,%rax
  je     L1
  cmpq   $0x0,-0x48(%rbp)
  je     L1
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L117
L1:
  cmpq   $0x0,-0x48(%rbp)
  je     L19
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L19
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L91
L140:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  subq   $0x8,-0x48(%rbp)
  addq   $0x8,-0x20(%rbp)
  addq   $0x8,-0x28(%rbp)
L91:
  cmpq   $0x7,-0x48(%rbp)
  jbe    L82
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rcx
  mov    D12(%rip),%rax
  mov    (%rax),%rsi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rsi
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  not    %rax
  mov    %rdx,%rcx
  and    %rax,%rcx
  mov    D12(%rip),%rax
  mov    (%rax),%rdi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rdi
  mov    %rax,%rdx
  mov    D12(%rip),%rax
  mov    (%rax),%rax
  shr    %rax
  add    $0x1,%rax
  imul   %rdx,%rax
  and    %rcx,%rax
  test   %rax,%rax
  je     L140
L82:
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  jmp    L19
L22:
  subq   $0x1,-0x48(%rbp)
  addq   $0x1,-0x40(%rbp)
  addq   $0x1,-0x38(%rbp)
L19:
  cmpq   $0x0,-0x48(%rbp)
  je     L34
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L22
L34:
  mov    -0x38(%rbp),%rax
  movb   $0x0,(%rax)
  jmp    L112
L4:
  nop
L112:
  mov    -0x38(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %rax,%rbx
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    %rbx,%rax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
size_t strlcpy(char *d, const char *s, size_t n) {
  char *d0 = d;
  size_t *wd;
  const size_t *ws;
  if (!n--)
    goto finish;
  if (((uintptr_t)s & (sizeof(size_t) - 1)) == ((uintptr_t)d & (sizeof(size_t) - 1))) {
    for (; ((uintptr_t)s & (sizeof(size_t) - 1)) && n && (*d = *s); n--, s++, d++)
      ;
    if (n && *s) {
      wd = (void *)d;
      ws = (const void *)s;
      for (; n >= sizeof(size_t) && !((*ws) - ((size_t)-1 / UCHAR_MAX) & ~(*ws) & (((size_t)-1 / UCHAR_MAX) * (UCHAR_MAX / 2 + 1))); n -= sizeof(size_t), ws++, wd++)
        *wd = *ws;
      d = (void *)wd;
      s = (const void *)ws;
    }
  }
  for (; n && (*d = *s); n--, s++, d++)
    ;
  *d = 0;
finish:
  return d - d0 + strlen(s);
}
```