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

```asm
<hexdump_data>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %edi,0xc(%rsp)
  test   %rdx,%rdx
  je     L481
  movq   $0x0,(%rsp)
  mov    %rsi,%r12
  mov    %rdx,%rbp
  xor    %ebx,%ebx
  lea    D20(%rip),%r14
  cs nopw 0x0(%rax,%rax,1)
L78:
  mov    0xc(%rsp),%eax
  lea    D19(%rip),%rdi
  xor    %r15d,%r15d
  mov    $0x20,%r13d
  lea    (%rax,%rbx,1),%esi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L465
L425:
  cmp    $0x7,%r15d
  mov    $0x2d,%edx
  mov    (%r12,%rax,4),%esi
  mov    %r14,%rdi
  cmovne %r13d,%edx
  xor    %eax,%eax
  add    $0x1,%r15d
  call   <printf@plt>
  cmp    $0x10,%r15d
  je     L272
L465:
  lea    (%rbx,%r15,1),%eax
  cmp    %rbp,%rax
  jb     L425
  lea    D0(%rip),%rdi
  xor    %eax,%eax
  add    $0x1,%r15d
  call   <printf@plt>
  cmp    $0x10,%r15d
  jne    L465
L272:
  lea    D28(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    (%rsp),%rax
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  je     L157
  mov    0x0(%r13),%edi
  call   <putchar@plt>
  lea    0x1(%rbx),%eax
  cmp    %rax,%rbp
  ja     L42
L303:
  lea    0x2(%rbx),%eax
  cmp    %rax,%rbp
  ja     L557
L515:
  lea    0x3(%rbx),%eax
  cmp    %rax,%rbp
  ja     L28
L132:
  lea    0x4(%rbx),%eax
  cmp    %rax,%rbp
  ja     L261
L235:
  lea    0x5(%rbx),%eax
  cmp    %rax,%rbp
  ja     L49
L273:
  lea    0x6(%rbx),%eax
  cmp    %rax,%rbp
  ja     L652
L636:
  lea    0x7(%rbx),%eax
  cmp    %rax,%rbp
  ja     L135
L424:
  lea    0x8(%rbx),%eax
  cmp    %rax,%rbp
  ja     L11
L285:
  lea    0x9(%rbx),%eax
  cmp    %rax,%rbp
  ja     L77
L404:
  lea    0xa(%rbx),%eax
  cmp    %rax,%rbp
  ja     L413
L196:
  lea    0xb(%rbx),%eax
  cmp    %rax,%rbp
  ja     L252
L486:
  lea    0xc(%rbx),%eax
  cmp    %rax,%rbp
  ja     L621
L227:
  lea    0xd(%rbx),%eax
  cmp    %rax,%rbp
  ja     L253
L592:
  lea    0xe(%rbx),%eax
  cmp    %rax,%rbp
  ja     L59
L624:
  lea    0xf(%rbx),%eax
  cmp    %rax,%rbp
  ja     L315
L44:
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    0x10(%rbx),%eax
  mov    %rax,(%rsp)
  mov    %rax,%rbx
  cmp    %rbp,%rax
  jb     L78
L481:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L157:
  mov    $0x2e,%edi
  call   <putchar@plt>
  lea    0x1(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L303
L42:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L262
  mov    $0x2e,%edi
L242:
  call   <putchar@plt>
  lea    0x2(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L515
L557:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L648
  mov    $0x2e,%edi
L372:
  call   <putchar@plt>
  lea    0x3(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L132
L28:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L386
  mov    $0x2e,%edi
L281:
  call   <putchar@plt>
  lea    0x4(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L235
L261:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L506
  mov    $0x2e,%edi
L284:
  call   <putchar@plt>
  lea    0x5(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L273
L49:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L583
  mov    $0x2e,%edi
L266:
  call   <putchar@plt>
  lea    0x6(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L636
L652:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L383
  mov    $0x2e,%edi
L316:
  call   <putchar@plt>
  lea    0x7(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L424
L135:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L197
  mov    $0x2e,%edi
L367:
  call   <putchar@plt>
  lea    0x8(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L285
L11:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L55
  mov    $0x2e,%edi
L297:
  call   <putchar@plt>
  lea    0x9(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L404
L77:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L334
  mov    $0x2e,%edi
L314:
  call   <putchar@plt>
  lea    0xa(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L196
L413:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L38
  mov    $0x2e,%edi
L579:
  call   <putchar@plt>
  lea    0xb(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L486
L252:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L654
  mov    $0x2e,%edi
L92:
  call   <putchar@plt>
  lea    0xc(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L227
L621:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L670
  mov    $0x2e,%edi
L500:
  call   <putchar@plt>
  lea    0xd(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L592
L253:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L62
  mov    $0x2e,%edi
L668:
  call   <putchar@plt>
  lea    0xe(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L624
L59:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L326
  mov    $0x2e,%edi
L141:
  call   <putchar@plt>
  lea    0xf(%rbx),%eax
  cmp    %rax,%rbp
  jbe    L44
L315:
  lea    (%r12,%rax,4),%r13
  mov    0x0(%r13),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L667
  mov    $0x2e,%edi
L139:
  call   <putchar@plt>
  jmp    L44
L262:
  mov    0x0(%r13),%edi
  jmp    L242
L386:
  mov    0x0(%r13),%edi
  jmp    L281
L55:
  mov    0x0(%r13),%edi
  jmp    L297
L648:
  mov    0x0(%r13),%edi
  jmp    L372
L583:
  mov    0x0(%r13),%edi
  jmp    L266
L197:
  mov    0x0(%r13),%edi
  jmp    L367
L383:
  mov    0x0(%r13),%edi
  jmp    L316
L506:
  mov    0x0(%r13),%edi
  jmp    L284
L334:
  mov    0x0(%r13),%edi
  jmp    L314
L654:
  mov    0x0(%r13),%edi
  jmp    L92
L38:
  mov    0x0(%r13),%edi
  jmp    L579
L667:
  mov    0x0(%r13),%edi
  jmp    L139
L326:
  mov    0x0(%r13),%edi
  jmp    L141
L62:
  mov    0x0(%r13),%edi
  jmp    L668
L670:
  mov    0x0(%r13),%edi
  jmp    L500
```

tool_calls: name: disassemble_data
arguments: data_label: D20
type_guessed: string
name: disassemble_data
arguments: data_label: D19
type_guessed: string
name: disassemble_data
arguments: data_label: D0
type_guessed: string
name: disassemble_data
arguments: data_label: D28
type_guessed: string

tool: D20: %02x%c

tool: D19:   %04x: 

tool: D0:    

tool: D28:  :  

assistant: ```c
void hexdump_data(unsigned int offset, const uint8_t *data, size_t n) {
  unsigned int i, j;
  for (i = 0; i < n; i += 16) {
    printf("  %04x: ", i + offset);
    for (j = 0; j < 16; j++) {
      if (i + j < n)
        printf("%02x%c", data[i + j], (j == 7) ? '-' : ' ');
      else
        printf("   ");
    }
    printf(" :  ");
    for (j = 0; j < 16; j++) {
      if (i + j < n)
        putchar(isprint(data[i + j]) ? data[i + j] : '.');
    }
    putchar('\n');
  }
}
```