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

```asm
<hexdump>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L123
  mov    -0x38(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  lea    D37(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
L123:
  movl   $0x0,-0x2c(%rbp)
  jmp    L56
L62:
  mov    -0x2c(%rbp),%eax
  and    $0xf,%eax
  test   %eax,%eax
  jne    L146
  cmpl   $0x0,-0x2c(%rbp)
  je     L131
  lea    -0x20(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  lea    D12(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
L131:
  mov    -0x2c(%rbp),%edx
  mov    -0x50(%rbp),%rax
  lea    D2(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  jmp    L1
L146:
  mov    -0x2c(%rbp),%eax
  and    $0x7,%eax
  test   %eax,%eax
  jne    L1
  mov    -0x50(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x20,%edi
  call   <fputc@plt>
L1:
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x50(%rbp),%rax
  lea    D7(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x1f,%al
  jbe    L47
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7e,%al
  jbe    L93
L47:
  mov    -0x2c(%rbp),%eax
  and    $0xf,%eax
  mov    %eax,%eax
  movb   $0x2e,-0x20(%rbp,%rax,1)
  jmp    L4
L93:
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x2c(%rbp),%edx
  and    $0xf,%edx
  movzbl (%rax),%eax
  mov    %edx,%edx
  mov    %al,-0x20(%rbp,%rdx,1)
L4:
  mov    -0x2c(%rbp),%eax
  and    $0xf,%eax
  add    $0x1,%eax
  mov    %eax,%eax
  movb   $0x0,-0x20(%rbp,%rax,1)
  addl   $0x1,-0x2c(%rbp)
L56:
  mov    -0x48(%rbp),%rax
  cmp    %eax,-0x2c(%rbp)
  jb     L62
  mov    -0x2c(%rbp),%eax
  and    $0xf,%eax
  cmp    $0x8,%eax
  ja     L9
  mov    -0x2c(%rbp),%eax
  and    $0xf,%eax
  test   %eax,%eax
  je     L9
  mov    -0x50(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x20,%edi
  call   <fputc@plt>
  jmp    L9
L19:
  mov    -0x50(%rbp),%rax
  mov    %rax,%rcx
  mov    $0x3,%edx
  mov    $0x1,%esi
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <fwrite@plt>
  addl   $0x1,-0x2c(%rbp)
L9:
  mov    -0x2c(%rbp),%eax
  and    $0xf,%eax
  test   %eax,%eax
  jne    L19
  lea    -0x20(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  lea    D12(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L86
  call   <__stack_chk_fail@plt>
L86:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D37
type: string
name: disassemble_data
arguments: tag: D12
type: string
name: disassemble_data
arguments: tag: D2
type: string
name: disassemble_data
arguments: tag: D7
type: string
name: disassemble_data
arguments: tag: D5
type: string

tool: D37: %s:


tool: D12:   |%s|


tool: D2: %08x 

tool: D7:  %02x

tool: D5:    

assistant: ```c
void hexdump(const char *desc, const void *addr, size_t len, FILE *fp) {
  unsigned int i;
  unsigned char buf[17];
  const unsigned char *pc = (const unsigned char *)addr;
  if (desc != NULL)
    fprintf(fp, "%s:\n", desc);
  for (i = 0; i < (unsigned int)len; i++) {
    if ((i % 16) == 0) {
      if (i != 0)
        fprintf(fp, "  |%s|\n", buf);
      fprintf(fp, "%08x ", i);
    } else if ((i % 8) == 0) {
      fprintf(fp, " ");
    }
    fprintf(fp, " %02x", pc[i]);
    if ((pc[i] < 0x20) || (pc[i] > 0x7e)) {
      buf[i % 16] = '.';
    } else {
      buf[i % 16] = pc[i];
    }
    buf[(i % 16) + 1] = '\0';
  }
  if (i % 16 <= 8 && i % 16 != 0)
    fprintf(fp, " ");
  while ((i % 16) != 0) {
    fprintf(fp, "   ");
    i++;
  }
  fprintf(fp, "  |%s|\n", buf);
}
```