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

```asm
<bin_to_even_base>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  mov    %esi,%ebx
  sub    $0x18,%rsp
  jmp    L84
  nopl   0x0(%rax,%rax,1)
L86:
  add    $0x1,%ebp
L84:
  mov    %r12,%rdi
  call   <strlen@plt>
  add    %ebp,%eax
  cltd
  idiv   %ebx
  mov    %edx,%r14d
  test   %edx,%edx
  jne    L86
  mov    %r12,%rdi
  call   <strlen@plt>
  add    %ebp,%eax
  cltd
  idiv   %ebx
  lea    0x1(%rax),%edi
  call   <malloc@plt>
  mov    %r12,%rdi
  mov    %rax,%r15
  mov    %rax,(%rsp)
  call   <strlen@plt>
  mov    %r12,%rdi
  add    %ebp,%eax
  cltd
  idiv   %ebx
  cltq
  movb   $0x0,(%r15,%rax,1)
  call   <strlen@plt>
  mov    %r12,%rdi
  lea    (%rax,%rbp,1),%esi
  call   <pad_bin@plt>
  mov    %rax,%rdi
  mov    %rax,0x8(%rsp)
  mov    %rax,%r15
  call   <strlen@plt>
  cltd
  idiv   %ebx
  movslq %eax,%r12
  test   %r12d,%r12d
  jle    L80
  movslq %ebx,%r13
  cmp    $0x4,%ebx
  je     L53
  cmp    $0x3,%ebx
  je     L68
  mov    $0x4,%ebp
  nop
L33:
  mov    %ebp,%esi
  mov    %r15,%rdi
  add    $0x1,%r14d
  add    %ebx,%ebp
  call   <strndup@plt>
  add    %r13,%r15
  movb   $0x0,(%rax,%r13,1)
  mov    %rax,%rdi
  call   <free@plt>
  cmp    %r14d,%r12d
  jne    L33
L108:
  add    (%rsp),%r12
L104:
  mov    0x8(%rsp),%rdi
  call   <free@plt>
  movb   $0x0,(%r12)
  mov    (%rsp),%rax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L53:
  mov    (%rsp),%rcx
  lea    -0x1(%r12),%eax
  mov    0x8(%rsp),%r13
  mov    %rcx,%rbp
  lea    0x1(%rcx,%rax,1),%r15
  cs nopw 0x0(%rax,%rax,1)
L74:
  mov    %ebx,%esi
  mov    %r13,%rdi
  add    $0x1,%rbp
  add    $0x4,%ebx
  call   <strndup@plt>
  add    $0x4,%r13
  movb   $0x0,0x4(%rax)
  mov    %rax,%rdi
  mov    %rax,%r14
  call   <single_digit_bin_to_hex@plt>
  mov    %r14,%rdi
  mov    %al,-0x1(%rbp)
  call   <free@plt>
  cmp    %r15,%rbp
  jne    L74
  jmp    L108
  nopl   0x0(%rax)
L68:
  mov    (%rsp),%rcx
  lea    -0x1(%r12),%eax
  mov    0x8(%rsp),%r13
  mov    $0x4,%ebp
  mov    %rcx,%rbx
  lea    0x1(%rcx,%rax,1),%r15
  nopl   0x0(%rax,%rax,1)
L1:
  mov    %ebp,%esi
  mov    %r13,%rdi
  add    $0x1,%rbx
  add    $0x3,%ebp
  call   <strndup@plt>
  add    $0x3,%r13
  movb   $0x0,0x3(%rax)
  mov    %rax,%rdi
  mov    %rax,%r14
  call   <single_digit_bin_to_oct@plt>
  mov    %r14,%rdi
  mov    %al,-0x1(%rbx)
  call   <free@plt>
  cmp    %rbx,%r15
  jne    L1
  jmp    L108
  nopl   0x0(%rax)
L80:
  mov    (%rsp),%r12
  jmp    L104
```

assistant: ```c
char *bin_to_even_base(char *bin, int size_of_digit) {
  int offset = 0;
  int i = 0;
  int j = 4;
  int k = 0;
  int number_of_hex_digits = 0;
  char *substr;
  char *out;
  int r = 0;
  while (((strlen(bin) + offset) % size_of_digit) != 0) {
    offset++;
  }
  out = malloc((strlen(bin) + offset) / size_of_digit + 1);
  out[(strlen(bin) + offset) / size_of_digit] = '\0';
  r = (int)strlen(bin) + offset;
  bin = pad_bin(bin, r);
  number_of_hex_digits = (int)strlen(bin) / size_of_digit;
  if (false) {
    printf("-   `bin_to_hex(%s)`, (`number_of_hex_digits = %i`)\n", bin, number_of_hex_digits);
  }
  while (k < number_of_hex_digits) {
    substr = strndup(bin + i, j);
    substr[size_of_digit] = '\0';
    if (false)
      printf("\t-   Subtring from `%i` to `%i`: `%s`, Counter: %i\n", i, j, substr, k);
    i = i + size_of_digit;
    j = j + size_of_digit;
    if (size_of_digit == 4) {
      out[k] = single_digit_bin_to_hex(substr);
    } else if (size_of_digit == 3) {
      out[k] = single_digit_bin_to_oct(substr);
    }
    free(substr);
    k++;
  }
  free(bin);
  out[k] = '\0';
  return out;
}
```