user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<bin_to_base64>:
  endbr64
  sub    $0x58,%rsp
  movdqa D28(%rip),%xmm0
  mov    %rdx,%r8
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  movb   $0x2d,0x40(%rsp)
  movaps %xmm0,(%rsp)
  movdqa D2(%rip),%xmm0
  movaps %xmm0,0x10(%rsp)
  movdqa D26(%rip),%xmm0
  movaps %xmm0,0x20(%rsp)
  movdqa D3(%rip),%xmm0
  movaps %xmm0,0x30(%rsp)
  cmp    $0x2,%rdx
  ja     L0
  jmp    L9
  nopl   0x0(%rax,%rax,1)
L83:
  movzbl (%rsi),%eax
  add    $0x4,%rdi
  sub    $0x3,%r8
  sub    $0x4,%rcx
  add    $0x3,%rsi
  shr    $0x2,%al
  and    $0x3f,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x4(%rdi)
  movzbl -0x3(%rsi),%eax
  movzbl -0x2(%rsi),%edx
  shl    $0x4,%eax
  shr    $0x4,%dl
  and    $0x30,%eax
  movzbl %dl,%edx
  or     %edx,%eax
  cltq
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x3(%rdi)
  movzbl -0x2(%rsi),%eax
  movzbl -0x1(%rsi),%edx
  shl    $0x2,%eax
  shr    $0x6,%dl
  and    $0x3c,%eax
  movzbl %dl,%edx
  or     %edx,%eax
  cltq
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x2(%rdi)
  movzbl -0x1(%rsi),%eax
  and    $0x3f,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x1(%rdi)
  cmp    $0x2,%r8
  jbe    L9
L0:
  cmp    $0xa,%rcx
  ja     L83
L9:
  test   %r8,%r8
  je     L23
  cmp    $0x4,%rcx
  jbe    L23
  movzbl (%rsi),%eax
  shr    $0x2,%al
  and    $0x3f,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,(%rdi)
  movzbl (%rsi),%eax
  shl    $0x4,%eax
  and    $0x30,%eax
  cmp    $0x1,%r8
  je     L61
  movzbl 0x1(%rsi),%edx
  shr    $0x4,%dl
  or     %edx,%eax
  and    $0x3f,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x1(%rdi)
  movzbl 0x1(%rsi),%eax
  shl    $0x2,%eax
  and    $0x3c,%eax
  movzbl (%rsp,%rax,1),%eax
L19:
  mov    %al,0x2(%rdi)
  add    $0x4,%rdi
  movb   $0x2d,-0x1(%rdi)
L23:
  movb   $0x0,(%rdi)
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L6
  add    $0x58,%rsp
  ret
  nopl   (%rax)
L61:
  movzbl %al,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x1(%rdi)
  mov    $0x3d,%eax
  jmp    L19
L6:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D28
type: byte[16]
name: parse_data
arguments: label: D2
type: byte[16]
name: parse_data
arguments: label: D26
type: byte[16]
name: parse_data
arguments: label: D3
type: byte[16]

tool: {"D28": [0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50]}

tool: {"D2": [0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x61,0x62,0x63,0x64,0x65,0x66]}

tool: {"D26": [0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76]}

tool: {"D3": [0x77,0x78,0x79,0x7a,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x5f]}

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';
}
```