user: Converte this assembly snippet into its equivalent C code:

```asm
<dump_memory>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbx
  mov    %esi,%r14d
  lea    D30(%rip),%rdi
  call   <puts@plt>
  test   %r14d,%r14d
  jle    L108
  mov    $0x0,%ebp
  lea    D80(%rip),%r15
  jmp    L5
L42:
  movzbl %sil,%esi
  lea    D26(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L72:
  movzbl (%r12),%esi
  lea    D25(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebp,%r13d
  test   $0x1,%bpl
  je     L20
L52:
  test   $0x3,%r13b
  je     L71
L105:
  test   $0x7,%r13b
  je     L51
L13:
  mov    $0xa,%edi
  call   <putchar@plt>
  add    $0x1,%ebp
  add    $0x1,%rbx
  cmp    %ebp,%r14d
  je     L108
L5:
  mov    %rbx,%r12
  mov    %rbx,%rsi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movzbl (%rbx),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5e,%al
  jbe    L42
  lea    D2(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L72
L20:
  movswl (%r12),%esi
  lea    D72(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L52
L71:
  mov    (%r12),%esi
  lea    D35(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  pxor   %xmm0,%xmm0
  cvtss2sd (%r12),%xmm0
  lea    D22(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  jmp    L105
L51:
  movsd  (%r12),%xmm0
  lea    D19(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  jmp    L13
L108:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: read_data
arguments: data_label: D30
type_guessed: string
name: read_data
arguments: data_label: D80
type_guessed: string
name: read_data
arguments: data_label: D26
type_guessed: string
name: read_data
arguments: data_label: D25
type_guessed: string
name: read_data
arguments: data_label: D2
type_guessed: string
name: read_data
arguments: data_label: D72
type_guessed: string
name: read_data
arguments: data_label: D35
type_guessed: string
name: read_data
arguments: data_label: D22
type_guessed: string
name: read_data
arguments: data_label: D19
type_guessed: string

tool: D30: Address          char   hexCh         shor         integer               float         foubleFloat

tool: D80: 0x%08x	

tool: D26: %3c	

tool: D25: 0x%02x	

tool: D2:   ?	

tool: D72: %+12hd	

tool: D35: %+12d	

tool: D22: 	%+.6e	

tool: D19: %+.6e	

assistant: ```c
void dump_memory(void *p, int len) {
  int i;
  printf("Address          char   hexCh         shor         integer               float         foubleFloat\n");
  for (i = 0; i < len; i++) {
    printf("0x%08x\t", p + i);
    if (((*(unsigned char *)(p + i)) < 32) || ((*(unsigned char *)(p + i)) > 126)) {
      printf("  ?\t");
    } else {
      printf("%3c\t", *(unsigned char *)(p + i));
    }
    printf("0x%02x\t", *(unsigned char *)(p + i));
    if (i % 2 == 0) {
      printf("%+12hd\t", *(short *)(p + i));
    }
    if (i % 4 == 0) {
      printf("%+12d\t", *(int *)(p + i));
    }
    if (i % 4 == 0) {
      printf("\t%+.6e\t", *(float *)(p + i));
    }
    if (i % 8 == 0) {
      printf("%+.6e\t", *(double *)(p + i));
    }
    printf("\n");
  }
}
```