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

```asm
<encode_base64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    $0xaaaaaaab,%eax
  imul   %rdx,%rax
  shr    $0x20,%rax
  shr    %eax
  mov    %eax,-0x14(%rbp)
  movl   $0x0,-0x18(%rbp)
  jmp    L82
L9:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    -0x38(%rbp),%rdx
  mov    %al,(%rdx)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  and    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  shr    $0x4,%al
  or     %edx,%eax
  movzbl %al,%eax
  mov    -0x38(%rbp),%rdx
  lea    0x1(%rdx),%rbx
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    %al,(%rbx)
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x2,%eax
  and    $0x3c,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  shr    $0x6,%al
  or     %edx,%eax
  movzbl %al,%eax
  mov    -0x38(%rbp),%rdx
  lea    0x2(%rdx),%rbx
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    %al,(%rbx)
  mov    -0x28(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  mov    -0x38(%rbp),%rdx
  lea    0x3(%rdx),%rbx
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    %al,(%rbx)
  addq   $0x3,-0x28(%rbp)
  addq   $0x4,-0x38(%rbp)
  addl   $0x1,-0x18(%rbp)
L82:
  mov    -0x18(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jb     L9
  mov    -0x2c(%rbp),%ecx
  mov    %ecx,%edx
  mov    $0xaaaaaaab,%eax
  imul   %rdx,%rax
  shr    $0x20,%rax
  shr    %eax
  mov    %eax,%edx
  add    %edx,%edx
  add    %eax,%edx
  mov    %ecx,%eax
  sub    %edx,%eax
  cmp    $0x2,%eax
  je     L41
  cmp    $0x2,%eax
  ja     L55
  test   %eax,%eax
  je     L70
  cmp    $0x1,%eax
  je     L13
  jmp    L55
L70:
  mov    -0x38(%rbp),%rax
  movb   $0x0,(%rax)
  jmp    L55
L13:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    -0x38(%rbp),%rdx
  mov    %al,(%rdx)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  movzbl %al,%eax
  and    $0x30,%eax
  mov    -0x38(%rbp),%rdx
  lea    0x1(%rdx),%rbx
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    %al,(%rbx)
  mov    -0x38(%rbp),%rax
  add    $0x2,%rax
  movb   $0x3d,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x3,%rax
  movb   $0x3d,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movb   $0x0,(%rax)
  jmp    L55
L41:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    -0x38(%rbp),%rdx
  mov    %al,(%rdx)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  and    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  shr    $0x4,%al
  or     %edx,%eax
  movzbl %al,%eax
  mov    -0x38(%rbp),%rdx
  lea    0x1(%rdx),%rbx
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    %al,(%rbx)
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x2,%eax
  movzbl %al,%eax
  and    $0x3c,%eax
  mov    -0x38(%rbp),%rdx
  lea    0x2(%rdx),%rbx
  mov    %eax,%edi
  call   <binary_to_base64@plt>
  mov    %al,(%rbx)
  mov    -0x38(%rbp),%rax
  add    $0x3,%rax
  movb   $0x3d,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movb   $0x0,(%rax)
  nop
L55:
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edi
  call   <encode_base64_length@plt>
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]) {
  unsigned int full_sets = input_length / 3;
  for (unsigned int i = 0; i < full_sets; ++i) {
    output[0] = binary_to_base64(input[0] >> 2);
    output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
    output[2] = binary_to_base64((input[1] & 0x0F) << 2 | input[2] >> 6);
    output[3] = binary_to_base64(input[2] & 0x3F);
    input += 3;
    output += 4;
  }
  switch (input_length % 3) {
  case 0:
    output[0] = '\0';
    break;
  case 1:
    output[0] = binary_to_base64(input[0] >> 2);
    output[1] = binary_to_base64((input[0] & 0x03) << 4);
    output[2] = '=';
    output[3] = '=';
    output[4] = '\0';
    break;
  case 2:
    output[0] = binary_to_base64(input[0] >> 2);
    output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
    output[2] = binary_to_base64((input[1] & 0x0F) << 2);
    output[3] = '=';
    output[4] = '\0';
    break;
  }
  return encode_base64_length(input_length);
}
```