user: 这段汇编代码用C语言表示是什么样的：

```asm
<MHD_str_remove_tokens_caseless_>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  movl   $0x0,-0x3c(%rbp)
  movq   $0x0,-0x38(%rbp)
  jmp    L130
L128:
  addq   $0x1,-0x38(%rbp)
L56:
  mov    -0x38(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L232
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L128
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L128
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L128
L232:
  mov    -0x38(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L193
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
L329:
  addq   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L145
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L145
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L145
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L329
L145:
  mov    -0x18(%rbp),%rax
  sub    -0x20(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  sub    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  jmp    L94
L386:
  addq   $0x1,-0x38(%rbp)
L94:
  mov    -0x38(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L28
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L386
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L386
L28:
  mov    -0x38(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L360
  mov    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L329
L360:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  jne    L387
  mov    -0x10(%rbp),%rdx
  mov    -0x18(%rbp),%rcx
  mov    -0x48(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <MHD_str_equal_caseless_bin_n_@plt>
  test   %rax,%rax
  je     L130
  mov    -0x50(%rbp),%rax
  movq   $0x0,(%rax)
  movl   $0x1,-0x3c(%rbp)
  jmp    L130
L387:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x10(%rbp),%rdx
  add    $0x2,%rdx
  cmp    %rdx,%rax
  jbe    L130
  movq   $0x0,-0x30(%rbp)
  movq   $0x0,-0x28(%rbp)
L123:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x30(%rbp),%rcx
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  cmp    %rdx,%rax
  je     L278
  mov    -0x30(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  add    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L23
L278:
  mov    -0x48(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x10(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <MHD_str_equal_caseless_bin_n_@plt>
  test   %rax,%rax
  je     L23
  movl   $0x1,-0x3c(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  add    $0x2,%rax
  mov    %rax,-0x30(%rbp)
  jmp    L169
L23:
  cmpq   $0x0,-0x28(%rbp)
  je     L308
  mov    -0x28(%rbp),%rax
  add    $0x2,%rax
  cmp    %rax,-0x30(%rbp)
  je     L26
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x2c,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x20,(%rax)
  jmp    L308
L26:
  addq   $0x2,-0x28(%rbp)
L308:
  mov    -0x30(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  je     L290
  mov    -0x48(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    -0x48(%rbp),%rcx
  mov    -0x28(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
L290:
  addq   $0x1,-0x30(%rbp)
  addq   $0x1,-0x28(%rbp)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x30(%rbp)
  jae    L317
  mov    -0x48(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L308
L317:
  addq   $0x2,-0x30(%rbp)
L169:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x30(%rbp),%rcx
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  cmp    %rdx,%rax
  jae    L123
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x30(%rbp)
  jae    L21
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  sub    -0x30(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  je     L342
  mov    -0x28(%rbp),%rax
  add    $0x2,%rax
  cmp    %rax,-0x30(%rbp)
  je     L205
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x2c,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x20,(%rax)
  jmp    L342
L205:
  addq   $0x2,-0x28(%rbp)
L342:
  mov    -0x30(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  je     L100
  mov    -0x48(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x48(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <memmove@plt>
L100:
  mov    -0x8(%rbp),%rax
  add    %rax,-0x28(%rbp)
L21:
  mov    -0x50(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  mov    %rdx,(%rax)
L130:
  mov    -0x38(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L9
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L56
  jmp    L9
L193:
  nop
L9:
  mov    -0x3c(%rbp),%eax
  leave
  ret
```

assistant: ```c
int MHD_str_remove_tokens_caseless_(char *str, size_t *str_len, const char *const tokens, const size_t tokens_len) {
  const char *const t = tokens;
  size_t pt;
  int token_removed;
  ((void)0);
  token_removed = 0;
  pt = 0;
  while (pt < tokens_len && *str_len != 0) {
    const char *tkn;
    size_t tkn_len;
    while ((pt < tokens_len) && ((' ' == t[pt]) || ('\t' == t[pt]) || (',' == t[pt])))
      pt++;
    if (pt >= tokens_len)
      break;
    tkn = t + pt;
    do {
      do {
        pt++;
      } while (pt < tokens_len && (' ' != t[pt] && '\t' != t[pt] && ',' != t[pt]));
      tkn_len = pt - (size_t)(tkn - t);
      while (pt < tokens_len && (' ' == t[pt] || '\t' == t[pt]))
        pt++;
    } while (pt < tokens_len && ',' != t[pt]);
    ((void)0);
    if (*str_len == tkn_len) {
      if (MHD_str_equal_caseless_bin_n_(str, tkn, tkn_len)) {
        *str_len = 0;
        token_removed = (!0);
      }
      continue;
    }
    if (*str_len > tkn_len + 2) {
      size_t pr;
      size_t pw;
      pr = 0;
      pw = 0;
      do {
        ((void)0);
        ((void)0);
        if ((((*str_len) == (pr + tkn_len)) || (',' == str[pr + tkn_len])) && MHD_str_equal_caseless_bin_n_(str + pr, tkn, tkn_len)) {
          ((void)0);
          token_removed = (!0);
          pr += tkn_len + 2;
        } else {
          if (0 != pw) {
            if (pr != pw + 2) {
              str[pw++] = ',';
              str[pw++] = ' ';
            } else
              pw += 2;
          }
          do {
            if (pr != pw)
              str[pw] = str[pr];
            pr++;
            pw++;
          } while (pr < *str_len && ',' != str[pr]);
          pr += 2;
        }
        if ((*str_len) < (pr + tkn_len)) {
          if ((*str_len) > pr) {
            size_t copy_size;
            copy_size = *str_len - pr;
            if (0 != pw) {
              if (pr != pw + 2) {
                str[pw++] = ',';
                str[pw++] = ' ';
              } else
                pw += 2;
            }
            if (pr != pw)
              memmove(str + pw, str + pr, copy_size);
            pw += copy_size;
          }
          *str_len = pw;
          break;
        }
        ((void)0);
        ((void)0);
        ((void)0);
        ((void)0);
      } while (1);
    }
  }
  return token_removed;
}
```