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

```asm
<bin_to_base64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movabs $0x4847464544434241,%rax
  movabs $0x504f4e4d4c4b4a49,%rdx
  mov    %rax,-0x50(%rbp)
  mov    %rdx,-0x48(%rbp)
  movabs $0x5857565554535251,%rax
  movabs $0x6665646362615a59,%rdx
  mov    %rax,-0x40(%rbp)
  mov    %rdx,-0x38(%rbp)
  movabs $0x6e6d6c6b6a696867,%rax
  movabs $0x767574737271706f,%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
  movabs $0x333231307a797877,%rax
  movabs $0x5f2e393837363534,%rdx
  mov    %rax,-0x20(%rbp)
  mov    %rdx,-0x18(%rbp)
  movb   $0x2d,-0x10(%rbp)
  jmp    L29
L4:
  mov    -0x70(%rbp),%rax
  movzbl (%rax),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%ecx
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x70(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  and    $0x30,%eax
  mov    %eax,%edx
  mov    -0x70(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  shr    $0x4,%al
  movzbl %al,%eax
  or     %edx,%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%ecx
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x70(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x2,%eax
  and    $0x3c,%eax
  mov    %eax,%edx
  mov    -0x70(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  shr    $0x6,%al
  movzbl %al,%eax
  or     %edx,%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%ecx
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x70(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%ecx
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  subq   $0x4,-0x80(%rbp)
  subq   $0x3,-0x78(%rbp)
  addq   $0x3,-0x70(%rbp)
L29:
  cmpq   $0x2,-0x78(%rbp)
  jbe    L35
  cmpq   $0xa,-0x80(%rbp)
  ja     L4
L35:
  cmpq   $0x0,-0x78(%rbp)
  je     L19
  cmpq   $0x4,-0x80(%rbp)
  jbe    L19
  mov    -0x70(%rbp),%rax
  movzbl (%rax),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%ecx
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x70(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  and    $0x30,%eax
  mov    %al,-0x51(%rbp)
  cmpq   $0x1,-0x78(%rbp)
  jbe    L84
  mov    -0x70(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  shr    $0x4,%al
  or     %al,-0x51(%rbp)
L84:
  movzbl -0x51(%rbp),%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%ecx
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  cmpq   $0x1,-0x78(%rbp)
  jbe    L61
  mov    -0x70(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x2,%eax
  and    $0x3c,%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%eax
  mov    %eax,%ecx
  jmp    L3
L61:
  mov    $0x3d,%ecx
L3:
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  mov    %cl,(%rax)
  mov    -0x68(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x68(%rbp)
  movb   $0x2d,(%rax)
L19:
  mov    -0x68(%rbp),%rax
  movb   $0x0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L16
  call   <__stack_chk_fail@plt>
L16:
  leave
  ret
```

assistant: ```c
void bin_to_base64(unsigned char *out, const unsigned char *in, size_t len, size_t olen) {
  const char B64Chars[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-";
  while (len >= 3 && olen > 10) {
    *out++ = B64Chars[in[0] >> 2];
    *out++ = B64Chars[((in[0] << 4) & 0x30) | (in[1] >> 4)];
    *out++ = B64Chars[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
    *out++ = B64Chars[in[2] & 0x3f];
    olen -= 4;
    len -= 3;
    in += 3;
  }
  if (len > 0 && olen > 4) {
    unsigned char fragment;
    *out++ = B64Chars[in[0] >> 2];
    fragment = (in[0] << 4) & 0x30;
    if (len > 1)
      fragment |= in[1] >> 4;
    *out++ = B64Chars[fragment];
    *out++ = (len < 2) ? '=' : B64Chars[(in[1] << 2) & 0x3c];
    *out++ = '-';
  }
  *out = '\0';
}
```