user: 请将以下的汇编代码转换成C语言代码:

```asm
<vmir_hexdump>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,0x10(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  test   %edx,%edx
  jle    L42
  lea    -0x1(%rdx),%eax
  mov    %rsi,%r14
  lea    0x20(%rsp),%r13
  mov    %edx,%r15d
  shr    $0x4,%eax
  movq   $0x1,(%rsp)
  shl    $0x4,%rax
  add    $0x11,%rax
  mov    %rax,0x18(%rsp)
  nopl   0x0(%rax,%rax,1)
L288:
  mov    (%rsp),%rbx
  lea    D22(%rip),%rdx
  mov    %r13,%rdi
  xor    %eax,%eax
  mov    $0x64,%esi
  xor    %ebp,%ebp
  lea    -0x1(%rbx),%ecx
  mov    %ebx,0xc(%rsp)
  call   <snprintf@plt>
  mov    %eax,%r12d
  jmp    L368
  nopl   0x0(%rax,%rax,1)
L8:
  lea    D25(%rip),%rcx
  lea    D64(%rip),%rdx
  xor    %eax,%eax
  call   <snprintf@plt>
  add    %eax,%r12d
  cmp    %ebx,%r15d
  jle    L319
  cmp    $0x10,%ebp
  je     L23
L526:
  add    $0x1,%rbx
L368:
  mov    $0x64,%esi
  movslq %r12d,%rdi
  add    $0x1,%ebp
  mov    -0x4(%r14,%rbx,4),%r8d
  sub    %r12d,%esi
  add    %r13,%rdi
  cmp    $0x9,%ebp
  jne    L8
  lea    D85(%rip),%rcx
  lea    D64(%rip),%rdx
  xor    %eax,%eax
  call   <snprintf@plt>
  add    %eax,%r12d
  cmp    %ebx,%r15d
  jg     L526
  mov    $0x18,%edx
  nopl   0x0(%rax,%rax,1)
L63:
  movslq %r12d,%rax
  add    %r13,%rax
  cmp    $0x8,%edx
  jae    L409
  test   $0x4,%dl
  jne    L179
  test   %edx,%edx
  je     L295
  movb   $0x20,(%rax)
  test   $0x2,%dl
  jne    L18
L295:
  mov    (%rsp),%rbx
  add    %r12d,%edx
  mov    $0x2e,%ecx
  movslq %edx,%rdi
  mov    -0x4(%r14,%rbx,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x1(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  cmp    %ebx,%r15d
  jle    L10
  mov    (%r14,%rbx,4),%esi
  mov    0xc(%rsp),%ebx
  cltq
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x2(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x1(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x3(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x2(%rbx),%esi
  cmp    %esi,%r15d
  jle    L10
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x4(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x3(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x5(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x4(%rbx),%esi
  cmp    %esi,%r15d
  jle    L10
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x6(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x5(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x7(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x6(%rbx),%esi
  cmp    %esi,%r15d
  jle    L10
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x8(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x7(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x9(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x8(%rbx),%esi
  cmp    %esi,%r15d
  jle    L10
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0xa(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x9(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0xb(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0xa(%rbx),%esi
  cmp    %esi,%r15d
  jle    L10
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0xc(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0xb(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0xd(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0xc(%rbx),%esi
  cmp    %esi,%r15d
  jle    L10
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0xe(%rdx),%edi
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0xd(%rbx),%eax
  cmp    %eax,%r15d
  jle    L302
  cltq
  movslq %edi,%rdi
  lea    0xf(%rdx),%r8d
  mov    (%r14,%rax,4),%eax
  lea    -0x20(%rax),%esi
  cmp    $0x5f,%esi
  cmovae %ecx,%eax
  mov    %al,0x20(%rsp,%rdi,1)
  lea    0xe(%rbx),%eax
  cmp    %eax,%r15d
  jle    L34
  cltq
  movslq %r8d,%r8
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x10(%rdx),%eax
  cmovae %ecx,%esi
  mov    %sil,0x20(%rsp,%r8,1)
L10:
  mov    0x10(%rsp),%rsi
  cltq
  mov    %r13,%rdx
  lea    D69(%rip),%rdi
  movb   $0x0,0x20(%rsp,%rax,1)
  call   <printf@plt>
  mov    0xc(%rsp),%eax
  addq   $0x10,(%rsp)
  mov    (%rsp),%rcx
  add    $0xf,%eax
  cmp    0x18(%rsp),%rcx
  jne    L288
  cmp    %eax,%r15d
  jle    L42
  movslq %eax,%rbx
  mov    $0x2e,%ebp
  nopl   0x0(%rax,%rax,1)
L260:
  lea    D22(%rip),%rdx
  mov    $0x64,%esi
  xor    %eax,%eax
  mov    %ebx,%ecx
  mov    %r13,%rdi
  call   <snprintf@plt>
  movdqa D45(%rip),%xmm0
  mov    %eax,%edx
  cltq
  add    %r13,%rax
  lea    0x34(%rdx),%edi
  movups %xmm0,(%rax)
  movslq %edi,%rdi
  movups %xmm0,0x10(%rax)
  movups %xmm0,0x20(%rax)
  lea    0x30(%rdx),%eax
  mov    (%r14,%rbx,4),%esi
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  lea    0x31(%rdx),%eax
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  lea    0x32(%rdx),%eax
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  lea    0x33(%rdx),%eax
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x35(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x1(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  mov    0x4(%r14,%rbx,4),%esi
  cltq
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x36(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x2(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x37(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x3(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x38(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x4(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x39(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x5(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x3a(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x6(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x3b(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x7(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x3c(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0x8(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x3d(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0x9(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x3e(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0xa(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x3f(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0xb(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x40(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0xc(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%esi
  lea    -0x20(%rsi),%eax
  cmp    $0x5f,%eax
  lea    0x41(%rdx),%eax
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rdi,1)
  lea    0xd(%rbx),%esi
  cmp    %esi,%r15d
  jle    L549
  movslq %esi,%rsi
  cltq
  mov    (%r14,%rsi,4),%esi
  lea    -0x20(%rsi),%edi
  cmp    $0x5f,%edi
  lea    0x42(%rdx),%edi
  cmovae %ebp,%esi
  mov    %sil,0x20(%rsp,%rax,1)
  lea    0xe(%rbx),%eax
  cmp    %eax,%r15d
  jle    L95
  cltq
  movslq %edi,%rdi
  mov    (%r14,%rax,4),%eax
  lea    -0x20(%rax),%esi
  cmp    $0x5f,%esi
  lea    0x43(%rdx),%esi
  cmovae %ebp,%eax
  mov    %al,0x20(%rsp,%rdi,1)
  lea    0xf(%rbx),%eax
  cmp    %eax,%r15d
  jle    L184
  cltq
  movslq %esi,%rsi
  mov    (%r14,%rax,4),%ecx
  lea    -0x20(%rcx),%eax
  cmp    $0x5f,%eax
  lea    0x44(%rdx),%eax
  cmovae %ebp,%ecx
  mov    %cl,0x20(%rsp,%rsi,1)
L549:
  mov    0x10(%rsp),%rsi
  cltq
  mov    %r13,%rdx
  add    $0x10,%rbx
  lea    D69(%rip),%rdi
  movb   $0x0,0x20(%rsp,%rax,1)
  call   <printf@plt>
  cmp    %ebx,%r15d
  jg     L260
L42:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L139
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L409:
  movabs $0x2020202020202020,%rbx
  lea    0x8(%rax),%rsi
  mov    %edx,%ecx
  and    $0xfffffffffffffff8,%rsi
  mov    %rbx,(%rax)
  mov    %rbx,-0x8(%rax,%rcx,1)
  sub    %rsi,%rax
  add    %edx,%eax
  and    $0xfffffff8,%eax
  cmp    $0x8,%eax
  jb     L295
  and    $0xfffffff8,%eax
  xor    %ecx,%ecx
L248:
  movabs $0x2020202020202020,%rbx
  mov    %ecx,%edi
  add    $0x8,%ecx
  mov    %rbx,(%rsi,%rdi,1)
  cmp    %eax,%ecx
  jb     L248
  jmp    L295
  xchg   %ax,%ax
L23:
  mov    $0x3,%edx
  jmp    L63
  nopw   0x0(%rax,%rax,1)
L319:
  mov    $0x11,%eax
  sub    %ebp,%eax
  lea    (%rax,%rax,2),%edx
  xor    %eax,%eax
  cmp    $0x7,%ebp
  setle  %al
  add    %eax,%edx
  jmp    L63
  nopl   0x0(%rax)
L302:
  mov    %edi,%eax
  jmp    L10
  nopw   0x0(%rax,%rax,1)
L95:
  mov    %edi,%eax
  jmp    L549
L179:
  mov    %edx,%ecx
  movl   $0x20202020,(%rax)
  movl   $0x20202020,-0x4(%rax,%rcx,1)
  jmp    L295
L184:
  mov    %esi,%eax
  jmp    L549
L34:
  mov    %r8d,%eax
  jmp    L10
L18:
  mov    %edx,%ecx
  mov    $0x2020,%esi
  mov    %si,-0x2(%rax,%rcx,1)
  jmp    L295
L139:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D22
type_infered: string
name: disassemble_data
arguments: data_tag: D25
type_infered: string
name: disassemble_data
arguments: data_tag: D64
type_infered: string
name: disassemble_data
arguments: data_tag: D85
type_infered: string
name: disassemble_data
arguments: data_tag: D69
type_infered: string
name: disassemble_data
arguments: data_tag: D45
type_infered: byte[16]

tool: D22: 0x%06x: 

tool: 

tool: D64: %s%02x 

tool: D85:  

tool: D69: %s: %s


tool: {"D45": [0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20]}

assistant: ```c
void __attribute__((unused)) vmir_hexdump(const char *pfx, const void *data_, int len) {
  int i, j, k;
  const uint8_t *data = data_;
  char buf[100];
  for (i = 0; i < len; i += 16) {
    int p = snprintf(buf, sizeof(buf), "0x%06x: ", i);
    for (j = 0; j + i < len && j < 16; j++) {
      p += snprintf(buf + p, sizeof(buf) - p, "%s%02x ", j == 8 ? " " : "", data[i + j]);
    }
    const int cnt = (17 - j) * 3 + (j < 8);
    for (k = 0; k < cnt; k++)
      buf[p + k] = ' ';
    p += cnt;
    for (j = 0; j + i < len && j < 16; j++)
      buf[p++] = data[i + j] < 32 || data[i + j] > 126 ? '.' : data[i + j];
    buf[p] = 0;
    printf("%s: %s\n", pfx, buf);
  }
}
```