user: What is the c source code of the assembly code below?

```asm
<add_bit_vector>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  movb   $0x0,-0x9(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0x0,-0x4(%rbp)
  movl   $0x0,-0x8(%rbp)
  jmp    L15
L16:
  movb   $0x0,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x5,%eax
  and    $0x40,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x3,%eax
  and    $0x20,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  and    $0x10,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sar    %eax
  and    $0x8,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sar    $0x3,%eax
  and    $0x4,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sar    $0x5,%eax
  and    $0x2,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  or     %edx,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  shr    $0x7,%al
  or     %al,-0x9(%rbp)
  movzbl -0x9(%rbp),%edx
  mov    -0x18(%rbp),%rax
  lea    D3(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    %eax,-0x4(%rbp)
  cmpl   $0x1,-0x4(%rbp)
  je     L2
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L2:
  addl   $0x1,-0x8(%rbp)
L15:
  cmpl   $0x1f,-0x8(%rbp)
  jle    L16
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D3
data_type: string
name: retrieve_data
arguments: label: D13
data_type: string

tool: D3: %c

tool: D13: Failure to output bit vector number.


assistant: ```c
void add_bit_vector(FILE *file, unsigned char bit_vector[32]) {
  unsigned char c = 0;
  int i = 0, ret = 0;
  for (i = 0; i < 32; i++) {
    c = 0x00;
    c |= ((bit_vector[i] & 0x01) << 7);
    c |= ((bit_vector[i] & 0x02) << 5);
    c |= ((bit_vector[i] & 0x04) << 3);
    c |= ((bit_vector[i] & 0x08) << 1);
    c |= ((bit_vector[i] & 0x10) >> 1);
    c |= ((bit_vector[i] & 0x20) >> 3);
    c |= ((bit_vector[i] & 0x40) >> 5);
    c |= ((bit_vector[i] & 0x80) >> 7);
    if ((ret = fprintf(file, "%c", c)) != 1) {
      printf("Failure to output bit vector number.\n");
      exit(1);
    }
  }
  return;
}
```