user: 请从给定的汇编指令推导出C源代码：

```asm
<frequency_calculator>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x4a0,%rsp
  mov    %rdi,-0x498(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x488(%rbp)
  jmp    L35
L112:
  mov    -0x488(%rbp),%eax
  cltq
  movl   $0x0,-0x480(%rbp,%rax,4)
  addl   $0x1,-0x488(%rbp)
L35:
  cmpl   $0x19,-0x488(%rbp)
  jle    L112
  movl   $0x0,-0x488(%rbp)
  jmp    L33
L66:
  mov    -0x488(%rbp),%eax
  cltq
  movl   $0x0,-0x410(%rbp,%rax,4)
  addl   $0x1,-0x488(%rbp)
L33:
  cmpl   $0xff,-0x488(%rbp)
  jle    L66
  movl   $0x0,-0x488(%rbp)
  jmp    L120
L76:
  mov    -0x488(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x498(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x489(%rbp)
  movsbl -0x489(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x410(%rbp,%rdx,4),%edx
  add    $0x1,%edx
  cltq
  mov    %edx,-0x410(%rbp,%rax,4)
  movsbl -0x489(%rbp),%eax
  mov    %eax,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  je     L111
  movsbl -0x489(%rbp),%eax
  mov    %eax,%edi
  call   <toupper@plt>
  sub    $0x41,%eax
  mov    %eax,-0x484(%rbp)
  mov    -0x484(%rbp),%eax
  cltq
  mov    -0x480(%rbp,%rax,4),%eax
  lea    0x1(%rax),%edx
  mov    -0x484(%rbp),%eax
  cltq
  mov    %edx,-0x480(%rbp,%rax,4)
L111:
  addl   $0x1,-0x488(%rbp)
L120:
  mov    -0x488(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x498(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L76
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0x488(%rbp)
  jmp    L124
L42:
  mov    -0x488(%rbp),%eax
  cltq
  mov    -0x410(%rbp,%rax,4),%eax
  test   %eax,%eax
  je     L46
  mov    -0x488(%rbp),%eax
  cltq
  mov    -0x410(%rbp,%rax,4),%edx
  mov    -0x488(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L46:
  addl   $0x1,-0x488(%rbp)
L124:
  cmpl   $0xfe,-0x488(%rbp)
  jle    L42
  lea    D17(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0x488(%rbp)
  jmp    L99
L5:
  mov    -0x488(%rbp),%eax
  cltq
  mov    -0x480(%rbp,%rax,4),%eax
  test   %eax,%eax
  je     L104
  mov    -0x488(%rbp),%eax
  cltq
  mov    -0x480(%rbp,%rax,4),%eax
  mov    -0x488(%rbp),%edx
  movsbl %dl,%edx
  lea    0x61(%rdx),%ecx
  mov    %eax,%edx
  mov    %ecx,%esi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L104:
  addl   $0x1,-0x488(%rbp)
L99:
  cmpl   $0x19,-0x488(%rbp)
  jle    L5
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L138
  call   <__stack_chk_fail@plt>
L138:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D34
type_guessed: string
name: disassemble_data
arguments: label: D4
type_guessed: string
name: disassemble_data
arguments: label: D17
type_guessed: string

tool: D34: ASCII Analysis:

tool: D4: '%c' = %d


tool: D17: Alphabet Analysis:

assistant: ```c
void frequency_calculator(char *src) {
  int alphabet[26];
  int ascii[256];
  int i;
  for (i = 0; i < 26; i++) {
    alphabet[i] = 0;
  }
  for (i = 0; i < 256; i++) {
    ascii[i] = 0;
  }
  char c;
  int j;
  i = 0;
  while (src[i] != '\0') {
    c = src[i];
    ascii[c]++;
    if (isalpha(c)) {
      j = toupper(c) - 65;
      alphabet[j]++;
    }
    i++;
  }
  printf("ASCII Analysis:\n");
  for (i = 0; i < 255; i++) {
    if (ascii[i] != 0) {
      printf("'%c' = %d\n", (char)i, ascii[i]);
    }
  }
  printf("Alphabet Analysis:\n");
  for (i = 0; i < 26; i++) {
    if (alphabet[i] != 0) {
      printf("'%c' = %d\n", (char)i + 97, alphabet[i]);
    }
  }
}
```