user: Please show me the C implementation that matches the assembly code listed below:

```asm
<ddump>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%rbp
  mov    %esi,%ebx
  mov    %esi,0x8(%rsp)
  lea    D97(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  test   %ebx,%ebx
  jle    L97
  mov    %ebx,%eax
  mov    %ebx,0x4(%rsp)
  sub    $0x1,%eax
  and    $0xfffffff0,%eax
  add    $0x10,%eax
  mov    %eax,0xc(%rsp)
  mov    $0x0,%r15d
  jmp    L16
L33:
  mov    0x4(%rsp),%eax
  mov    %eax,%r12d
  test   %eax,%eax
  jg     L81
  mov    $0x10,%r13d
  sub    0x4(%rsp),%r13d
  test   %r13d,%r13d
  jg     L37
  lea    D37(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
L104:
  lea    D77(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  subl   $0x10,0x4(%rsp)
  add    $0x10,%rbp
  cmp    0xc(%rsp),%r15d
  je     L97
L16:
  mov    %ebp,%esi
  lea    D59(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  add    $0x10,%r15d
  mov    $0x10,%r12d
  cmp    0x8(%rsp),%r15d
  jge    L33
L81:
  mov    $0x0,%ebx
  lea    D13(%rip),%r13
L120:
  movzbl 0x0(%rbp,%rbx,1),%esi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  add    $0x1,%rbx
  cmp    %ebx,%r12d
  jg     L120
  mov    $0x10,%r13d
  sub    %r12d,%r13d
  test   %r13d,%r13d
  jle    L90
L37:
  mov    $0x0,%ebx
  lea    D68(%rip),%r14
L85:
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  add    $0x1,%ebx
  cmp    %r13d,%ebx
  jl     L85
  lea    D37(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  test   %r12d,%r12d
  jle    L104
L75:
  mov    $0x0,%ebx
  jmp    L98
L136:
  lea    D32(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
L137:
  add    $0x1,%rbx
  cmp    %ebx,%r12d
  jle    L104
L98:
  movzbl 0x0(%rbp,%rbx,1),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5e,%al
  ja     L136
  movzbl %sil,%esi
  lea    D94(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  jmp    L137
L90:
  lea    D37(%rip),%rdi
  mov    $0x0,%eax
  call   <dprintf@plt>
  jmp    L75
L97:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D97
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D37
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D77
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D59
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D13
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D68
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D32
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D94
type_infered: string

tool: D97:  [Addr]   .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F


tool: D37:     

tool: D77: 


tool: D59: %08X: 

tool: D13: %02x 

tool: D68:    

tool: D32: .

tool: D94: %c

assistant: ```c
void ddump(unsigned char *pData, int len) {
  unsigned char *sbuf = pData;
  int length = len;
  int i = 0, j, offset;
  dprintf(" [Addr]   .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F\r\n");
  while (i < length) {
    dprintf("%08X: ", (int)(sbuf + i));
    if (i + 16 < length)
      offset = 16;
    else
      offset = length - i;
    for (j = 0; j < offset; j++)
      dprintf("%02x ", sbuf[i + j]);
    for (j = 0; j < 16 - offset; j++)
      dprintf("   ");
    dprintf("    ");
    for (j = 0; j < offset; j++) {
      if (' ' <= sbuf[i + j] && sbuf[i + j] <= '~')
        dprintf("%c", sbuf[i + j]);
      else
        dprintf(".");
    }
    dprintf("\n\r");
    i += 16;
  }
}
```