user: Translate the below assembly code into C programming language:

```asm
<parse_pool>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  lea    D69(%rip),%rsi
  call   <parse@plt>
  mov    %rax,0x8(%rsp)
  lea    D63(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x10(%rsp)
  lea    D109(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x18(%rsp)
  lea    D24(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x20(%rsp)
  lea    D139(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x28(%rsp)
  lea    D160(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x30(%rsp)
  lea    D141(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x38(%rsp)
  lea    D186(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x40(%rsp)
  lea    D101(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x48(%rsp)
  lea    D143(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x50(%rsp)
  lea    D84(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x58(%rsp)
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x60(%rsp)
  lea    D79(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x68(%rsp)
  lea    D154(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,%r12
  lea    D133(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,%rbp
  mov    %rax,0x78(%rsp)
  lea    D71(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,0x70(%rsp)
  lea    D149(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,%r13
  lea    D66(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,%r14
  lea    D126(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse@plt>
  mov    %rax,%r15
  lea    0x85(%rsp),%rdx
  mov    $0x2,%ecx
  lea    D85(%rip),%rsi
  mov    %rbx,%rdi
  call   <parse_string@plt>
  movb   $0x0,0x87(%rsp)
  cmpb   $0x53,0x86(%rsp)
  je     L8
  mov    $0x0,%eax
  test   %rbp,%rbp
  je     L0
  lea    (%r12,%r12,4),%rax
  lea    (%rax,%rax,4),%rax
  shl    $0x2,%rax
  mov    $0x0,%edx
  divq   0x78(%rsp)
L0:
  lea    0x85(%rsp),%rcx
  push   %r15
  push   %r14
  push   %r13
  push   0x88(%rsp)
  push   %rax
  push   %rbp
  push   %r12
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  push   0xa0(%rsp)
  mov    0xa0(%rsp),%r9
  mov    0x98(%rsp),%r8
  mov    0x90(%rsp),%rdx
  mov    0x88(%rsp),%rsi
  lea    D209(%rip),%rdi
  call   <printf@plt>
  sub    $0xffffffffffffff80,%rsp
L8:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D69
type: string
name: disassemble_data
arguments: data_tag: D63
type: string
name: disassemble_data
arguments: data_tag: D109
type: string
name: disassemble_data
arguments: data_tag: D24
type: string
name: disassemble_data
arguments: data_tag: D139
type: string
name: disassemble_data
arguments: data_tag: D160
type: string
name: disassemble_data
arguments: data_tag: D141
type: string
name: disassemble_data
arguments: data_tag: D186
type: string
name: disassemble_data
arguments: data_tag: D101
type: string
name: disassemble_data
arguments: data_tag: D143
type: string
name: disassemble_data
arguments: data_tag: D84
type: string
name: disassemble_data
arguments: data_tag: D132
type: string
name: disassemble_data
arguments: data_tag: D79
type: string
name: disassemble_data
arguments: data_tag: D154
type: string
name: disassemble_data
arguments: data_tag: D133
type: string
name: disassemble_data
arguments: data_tag: D71
type: string
name: disassemble_data
arguments: data_tag: D149
type: string
name: disassemble_data
arguments: data_tag: D66
type: string
name: disassemble_data
arguments: data_tag: D126
type: string
name: disassemble_data
arguments: data_tag: D85
type: string
name: disassemble_data
arguments: data_tag: D209
type: string

tool: D69: CI

tool: D63: PI

tool: D109: Pc

tool: D24: Pm

tool: D139: Oc

tool: D160: Om

tool: D141: Nc

tool: D186: Nm

tool: D101: ps

tool: D143: pt

tool: D84: px

tool: D132: pd

tool: D79: pr

tool: D154: gs

tool: D133: gt

tool: D71: fs

tool: D149: ft

tool: D66: os

tool: D126: ot

tool: D85: PT

tool: D209: 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);
}
```