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

```asm
<parse_pool>:
  endbr64
  push   %r15
  lea    D55(%rip),%rsi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  lea    0x85(%rsp),%r14
  call   <parse@plt>
  lea    D22(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%r12
  call   <parse@plt>
  lea    D23(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%r13
  call   <parse@plt>
  lea    D121(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x78(%rsp)
  call   <parse@plt>
  lea    D169(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x70(%rsp)
  call   <parse@plt>
  lea    D87(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x8(%rsp)
  call   <parse@plt>
  lea    D150(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x10(%rsp)
  call   <parse@plt>
  lea    D130(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x18(%rsp)
  call   <parse@plt>
  lea    D180(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x20(%rsp)
  call   <parse@plt>
  lea    D96(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x28(%rsp)
  call   <parse@plt>
  lea    D93(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x30(%rsp)
  call   <parse@plt>
  lea    D29(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x38(%rsp)
  call   <parse@plt>
  lea    D193(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x40(%rsp)
  call   <parse@plt>
  lea    D151(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x48(%rsp)
  call   <parse@plt>
  lea    D156(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%r15
  call   <parse@plt>
  lea    D60(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%rbx
  call   <parse@plt>
  lea    D83(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x50(%rsp)
  call   <parse@plt>
  lea    D116(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x58(%rsp)
  call   <parse@plt>
  lea    D10(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x60(%rsp)
  call   <parse@plt>
  mov    $0x2,%ecx
  mov    %r14,%rdx
  mov    %rbp,%rdi
  lea    D112(%rip),%rsi
  mov    %rax,0x68(%rsp)
  call   <parse_string@plt>
  cmpb   $0x53,0x86(%rsp)
  movb   $0x0,0x87(%rsp)
  je     L6
  xor    %eax,%eax
  test   %rbx,%rbx
  mov    0x70(%rsp),%r9
  mov    0x78(%rsp),%r8
  je     L12
  lea    (%r15,%r15,4),%rax
  xor    %edx,%edx
  lea    (%rax,%rax,4),%rax
  shl    $0x2,%rax
  div    %rbx
L12:
  push   0x68(%rsp)
  push   0x68(%rsp)
  push   0x68(%rsp)
  push   0x68(%rsp)
  push   %rax
  push   %rbx
  push   %r15
  push   0x80(%rsp)
  push   0x80(%rsp)
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  push   0x80(%rsp)
  lea    D179(%rip),%rdi
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  call   <printf@plt>
  sub    $0xffffffffffffff80,%rsp
L6:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L14
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L14:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: tag: D55
type_infered: string
name: read_data
arguments: tag: D22
type_infered: string
name: read_data
arguments: tag: D23
type_infered: string
name: read_data
arguments: tag: D121
type_infered: string
name: read_data
arguments: tag: D169
type_infered: string
name: read_data
arguments: tag: D87
type_infered: string
name: read_data
arguments: tag: D150
type_infered: string
name: read_data
arguments: tag: D130
type_infered: string
name: read_data
arguments: tag: D180
type_infered: string
name: read_data
arguments: tag: D96
type_infered: string
name: read_data
arguments: tag: D93
type_infered: string
name: read_data
arguments: tag: D29
type_infered: string
name: read_data
arguments: tag: D193
type_infered: string
name: read_data
arguments: tag: D151
type_infered: string
name: read_data
arguments: tag: D156
type_infered: string
name: read_data
arguments: tag: D60
type_infered: string
name: read_data
arguments: tag: D83
type_infered: string
name: read_data
arguments: tag: D116
type_infered: string
name: read_data
arguments: tag: D10
type_infered: string
name: read_data
arguments: tag: D112
type_infered: string
name: read_data
arguments: tag: D179
type_infered: string

tool: D55: CI

tool: D22: PI

tool: D23: Pc

tool: D121: Pm

tool: D169: Oc

tool: D87: Om

tool: D150: Nc

tool: D130: Nm

tool: D180: ps

tool: D96: pt

tool: D93: px

tool: D29: pd

tool: D193: pr

tool: D151: gs

tool: D156: gt

tool: D60: fs

tool: D83: ft

tool: D116: os

tool: D10: ot

tool: D112: PT

tool: D179: domid%lu,id%lu[%s]:pgp=%llu(max=%llu) obj=%llu(%llu) objnode=%llu(%llu) puts=%llu/%llu/%llu(dup=%llu/%llu) gets=%llu/%llu(%llu%%) flush=%llu/%llu flobj=%llu/%llu


assistant: ```c
void parse_pool(char *s) {
  char pool_type[3];
  unsigned long cli_id = parse(s, "CI");
  unsigned long pool_id = parse(s, "PI");
  unsigned long long pgp_count = parse(s, "Pc");
  unsigned long long max_pgp_count = parse(s, "Pm");
  unsigned long long obj_count = parse(s, "Oc");
  unsigned long long max_obj_count = parse(s, "Om");
  unsigned long long objnode_count = parse(s, "Nc");
  unsigned long long max_objnode_count = parse(s, "Nm");
  unsigned long long good_puts = parse(s, "ps");
  unsigned long long puts = parse(s, "pt");
  unsigned long long no_mem_puts = parse(s, "px");
  unsigned long long dup_puts_flushed = parse(s, "pd");
  unsigned long long dup_puts_replaced = parse(s, "pr");
  unsigned long long found_gets = parse(s, "gs");
  unsigned long long gets = parse(s, "gt");
  unsigned long long flushs_found = parse(s, "fs");
  unsigned long long flushs = parse(s, "ft");
  unsigned long long flush_objs_found = parse(s, "os");
  unsigned long long flush_objs = parse(s, "ot");
  parse_string(s, "PT", pool_type, 2);
  pool_type[2] = '\0';
  if (pool_type[1] == 'S')
    return;
  printf("domid%lu,id%lu[%s]:pgp=%llu(max=%llu) obj=%llu(%llu) "
         "objnode=%llu(%llu) puts=%llu/%llu/%llu(dup=%llu/%llu) "
         "gets=%llu/%llu(%llu%%) "
         "flush=%llu/%llu flobj=%llu/%llu\n",
         cli_id, pool_id, pool_type, pgp_count, max_pgp_count, obj_count, max_obj_count, objnode_count, max_objnode_count, good_puts, puts, no_mem_puts, dup_puts_flushed, dup_puts_replaced, found_gets, gets, gets ? (found_gets * 100LL) / gets : 0, flushs_found, flushs, flush_objs_found, flush_objs);
}
```