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

```asm
<outsym32>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  movabs $0xcccccccccccccccd,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x5,%rax
  mov    %rax,-0x18(%rbp)
  lea    -0x40(%rbp),%rdx
  mov    -0x44(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <getpiecestrtable@plt>
  mov    %rax,-0x10(%rbp)
  mov    $0x1,%edi
  call   <beginblock@plt>
  movq   $0x0,-0x28(%rbp)
  jmp    L76
L20:
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x40(%rbp),%rdx
  cmp    %rdx,%rax
  jae    L43
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L43
  mov    $0x0,%eax
  call   <linebreak@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <outcomment@plt>
L43:
  mov    $0x0,%edi
  call   <beginblock@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %eax,%edi
  call   <strdec@plt>
  mov    %rax,%rdi
  call   <out@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x20(%rax),%eax
  mov    %eax,%edi
  call   <straddress@plt>
  mov    %rax,%rdi
  call   <out@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x18(%rax),%eax
  mov    %eax,%edi
  call   <getindexfromsection@plt>
  mov    %eax,%ecx
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x1c(%rax),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <getsizestr@plt>
  mov    %rax,%rdi
  call   <out@plt>
  cmpq   $0x0,-0x28(%rbp)
  jne    L57
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  test   %rax,%rax
  jne    L57
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x10(%rax),%rax
  test   %rax,%rax
  jne    L57
  lea    D17(%rip),%rax
  mov    %rax,%rdi
  call   <out@plt>
  lea    D17(%rip),%rax
  mov    %rax,%rdi
  call   <out@plt>
  jmp    L58
L57:
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  mov    %rax,%rdi
  call   <ELF32_ST_BIND@plt>
  mov    %rax,%rdx
  lea    D35(%rip),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <strdefint@plt>
  mov    %rax,%rdi
  call   <strallocate@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  mov    %rax,%rdi
  call   <ELF32_ST_TYPE@plt>
  mov    %rax,%rdx
  lea    D58(%rip),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <strdefint@plt>
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    D3(%rip),%rax
  mov    %rax,%rdi
  call   <outf@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <deallocate@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x10(%rax),%rax
  lea    D32(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strdefint@plt>
  mov    %rax,%rdi
  call   <out@plt>
L58:
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    0x18(%rax),%eax
  mov    %eax,%edi
  call   <getsectionid@plt>
  mov    %rax,%rdi
  call   <out@plt>
  mov    $0x0,%eax
  call   <endblock@plt>
  addq   $0x1,-0x28(%rbp)
L76:
  mov    -0x28(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jl     L20
  mov    $0x0,%eax
  call   <endblock@plt>
  nop
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D17
type_guessed: string
name: extract_symbolic_data
arguments: tag: D35
type_guessed: string
name: extract_symbolic_data
arguments: tag: D58
type_guessed: string
name: extract_symbolic_data
arguments: tag: D3
type_guessed: string
name: extract_symbolic_data
arguments: tag: D32
type_guessed: string

tool: D17: 0

tool: D35: STB_

tool: D58: STT_

tool: D3: ELF32_ST_INFO(%s, %s)

tool: D32: STV_

assistant: ```c
void outsym32(void const *ptr, long size, int ndx) {
  Elf32_Sym const *syms = ptr;
  long count = size / sizeof *syms;
  char const *strtab;
  char *bind;
  long i;
  strtab = getpiecestrtable(ndx, &size);
  beginblock(1);
  for (i = 0; i < count; ++i) {
    if (syms[i].st_name < (Elf32_Word)size && strtab[syms[i].st_name]) {
      linebreak();
      outcomment(strtab + syms[i].st_name);
    }
    beginblock(0);
    (out(strdec(syms[i].st_name)));
    (out(straddress(syms[i].st_value)));
    out(getsizestr(syms[i].st_size, getindexfromsection(syms[i].st_shndx)));
    if (i == 0 && syms[i].st_info == 0 && syms[i].st_other == 0) {
      out("0");
      out("0");
    } else {
      bind = strallocate(strdefint(ELF32_ST_BIND(syms[i].st_info), "STB_"));
      outf("ELF32_ST_INFO(%s, %s)", bind, strdefint(ELF32_ST_TYPE(syms[i].st_info), "STT_"));
      deallocate(bind);
      (out(strdefint(syms[i].st_other, "STV_")));
    }
    out(getsectionid(syms[i].st_shndx));
    endblock();
  }
  endblock();
}
```