user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<string_recorder>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  mov    %rdi,-0xb8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0xa0(%rbp),%rdx
  mov    $0x0,%eax
  mov    $0x12,%ecx
  mov    %rdx,%rdi
  rep stos %rax,%es:(%rdi)
  movl   $0x0,-0xa8(%rbp)
  movl   $0x0,-0xa4(%rbp)
  jmp    L133
L52:
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L118
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jg     L118
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  movslq %eax,%rdx
  mov    -0xa0(%rbp,%rdx,4),%edx
  add    $0x1,%edx
  cltq
  mov    %edx,-0xa0(%rbp,%rax,4)
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  cmp    %eax,-0xa4(%rbp)
  jge    L157
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  mov    %eax,-0xa4(%rbp)
  jmp    L157
L118:
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L140
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jg     L140
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x57,%eax
  movslq %eax,%rdx
  mov    -0xa0(%rbp,%rdx,4),%edx
  add    $0x1,%edx
  cltq
  mov    %edx,-0xa0(%rbp,%rax,4)
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x57,%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  cmp    %eax,-0xa4(%rbp)
  jge    L157
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x57,%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  mov    %eax,-0xa4(%rbp)
  jmp    L157
L140:
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L157:
  addl   $0x1,-0xa8(%rbp)
L133:
  mov    -0xa8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L52
  jmp    L171
L94:
  movl   $0x0,-0xa8(%rbp)
  jmp    L123
L91:
  mov    -0xa8(%rbp),%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  test   %eax,%eax
  jle    L30
  cmpl   $0x9,-0xa8(%rbp)
  jle    L114
  mov    -0xa8(%rbp),%eax
  add    $0x57,%eax
  mov    %eax,%edi
  call   <putchar@plt>
  jmp    L100
L114:
  mov    -0xa8(%rbp),%eax
  add    $0x30,%eax
  mov    %eax,%edi
  call   <putchar@plt>
L100:
  mov    -0xa8(%rbp),%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  lea    -0x1(%rax),%edx
  mov    -0xa8(%rbp),%eax
  cltq
  mov    %edx,-0xa0(%rbp,%rax,4)
L30:
  addl   $0x1,-0xa8(%rbp)
L123:
  cmpl   $0x23,-0xa8(%rbp)
  jle    L91
L171:
  cmpl   $0x0,-0xa4(%rbp)
  jg     L94
  mov    $0xa,%edi
  call   <putchar@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L60
  call   <__stack_chk_fail@plt>
L60:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D9
type_infered: string

tool: D9: <invalid input string>

assistant: ```c
void string_recorder(char *s) {
  int record[36] = {0};
  int i = 0, max = 0;
  while (s[i] != '\0') {
    if (s[i] >= '0' && s[i] <= '9') {
      record[s[i] - '0']++;
      if (max < record[s[i] - '0']) {
        max = record[s[i] - '0'];
      }
    } else if (s[i] >= 'a' && s[i] <= 'z') {
      record[s[i] - 'a' + 10]++;
      if (max < record[s[i] - 'a' + 10]) {
        max = record[s[i] - 'a' + 10];
      }
    } else {
      printf("<invalid input string>\n");
    }
    i++;
  }
  while (max > 0) {
    for (i = 0; i < 36; i++) {
      if (record[i] > 0) {
        if (i > 9) {
          printf("%c", 'a' + i - 10);
        } else {
          printf("%c", '0' + i);
        }
        record[i]--;
      }
    }
  }
  printf("\n");
}
```