user: 下面的汇编指令对应的C源代码是什么：

```asm
<my_atoi>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  movl   $0x0,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L150
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  je     L35
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x58,%al
  jne    L47
L35:
  addq   $0x1,-0x18(%rbp)
  jmp    L184
L121:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L74
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L191
L74:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L232
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  sub    $0x37,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L191
L232:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L155
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  sub    $0x57,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L191
L155:
  mov    -0x4(%rbp),%eax
  jmp    L198
L191:
  addq   $0x1,-0x18(%rbp)
L184:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L121
  mov    -0x4(%rbp),%eax
  jmp    L198
L80:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D15(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L201
  mov    -0x4(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L82
L201:
  mov    -0x4(%rbp),%eax
  jmp    L198
L82:
  addq   $0x1,-0x18(%rbp)
L47:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L80
  mov    -0x4(%rbp),%eax
  jmp    L198
L150:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L90
  addq   $0x1,-0x18(%rbp)
L77:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L253
  mov    -0x4(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L177
L253:
  mov    -0x4(%rbp),%eax
  neg    %eax
  jmp    L198
L177:
  addq   $0x1,-0x18(%rbp)
  jmp    L77
L263:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L81
  mov    -0x4(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L123
L81:
  mov    -0x4(%rbp),%eax
  jmp    L198
L123:
  addq   $0x1,-0x18(%rbp)
L90:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L263
  mov    -0x4(%rbp),%eax
L198:
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D13
type_guessed: string
name: read_data
arguments: label: D27
type_guessed: string
name: read_data
arguments: label: D15
type_guessed: string

tool: D13: ABCDEF

tool: D27: abcdef

tool: D15: 01234567

assistant: ```c
int my_atoi(const char *s) {
  int a = 0;
  if (*s == '0') {
    s++;
    if (*s == 'x' || *s == 'X') {
      s++;
      while (*s) {
        if (isdigit(*s))
          a = (a << 4) + *s - '0';
        else if (strchr("ABCDEF", *s))
          a = (a << 4) + *s - 'A' + 10;
        else if (strchr("abcdef", *s))
          a = (a << 4) + *s - 'a' + 10;
        else
          return a;
        s++;
      }
      return a;
    }
    while (*s) {
      if (strchr("01234567", *s))
        a = (a << 3) + *s - '0';
      else
        return a;
      s++;
    }
    return a;
  }
  if (*s == '-') {
    s++;
    for (;;) {
      if (isdigit(*s))
        a = (a * 10) + *s - '0';
      else
        return -a;
      s++;
    }
  }
  while (*s) {
    if (isdigit(*s))
      a = (a * 10) + *s - '0';
    else
      return a;
    s++;
  }
  return a;
}
```