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

```asm
<atof>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x10,%rsp
  lea    0x1(%rdi),%r12
  movsbl (%rdi),%ebx
  pxor   %xmm6,%xmm6
  movss  %xmm6,0xc(%rsp)
  test   %ebx,%ebx
  je     L157
L74:
  mov    %ebx,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L0
  sub    $0x30,%ebx
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  mulsd  D28(%rip),%xmm1
  addsd  %xmm1,%xmm0
  pxor   %xmm3,%xmm3
  cvtsd2ss %xmm0,%xmm3
  movss  %xmm3,0xc(%rsp)
  add    $0x1,%r12
  movsbl -0x1(%r12),%ebx
  test   %ebx,%ebx
  jne    L74
  jmp    L157
L0:
  cmp    $0x2e,%ebx
  jne    L52
  lea    0x1(%r12),%r13
  movsbl (%r12),%ebx
  mov    $0x0,%ebp
  test   %ebx,%ebx
  je     L116
L184:
  mov    %ebx,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L10
  sub    $0x30,%ebx
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  mulsd  D28(%rip),%xmm1
  addsd  %xmm1,%xmm0
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm0,%xmm5
  movss  %xmm5,0xc(%rsp)
  sub    $0x1,%ebp
  add    $0x1,%r13
  movsbl -0x1(%r13),%ebx
  test   %ebx,%ebx
  jne    L184
  jmp    L122
L10:
  and    $0xffffffdf,%ebx
  cmp    $0x45,%ebx
  jne    L122
  mov    %r13,%r12
  jmp    L88
L105:
  lea    0x2(%r12),%r13
  movsbl 0x1(%r12),%ebx
  mov    $0x1,%r14d
  jmp    L53
L227:
  lea    0x2(%r12),%r13
  movsbl 0x1(%r12),%ebx
  mov    $0xffffffff,%r14d
  jmp    L53
L155:
  lea    (%r12,%r12,4),%eax
  lea    -0x30(%rbx,%rax,2),%r12d
  add    $0x1,%r13
  movsbl -0x1(%r13),%ebx
L128:
  mov    %ebx,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L155
  imul   %r14d,%r12d
  add    %r12d,%ebp
L122:
  test   %ebp,%ebp
  jle    L218
  movss  D24(%rip),%xmm0
L9:
  movss  0xc(%rsp),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm2,0xc(%rsp)
  sub    $0x1,%ebp
  jne    L9
L157:
  movss  0xc(%rsp),%xmm0
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L218:
  mov    %ebp,%ebx
L116:
  test   %ebx,%ebx
  jns    L157
  movsd  D7(%rip),%xmm1
L161:
  pxor   %xmm0,%xmm0
  cvtss2sd 0xc(%rsp),%xmm0
  mulsd  %xmm1,%xmm0
  pxor   %xmm4,%xmm4
  cvtsd2ss %xmm0,%xmm4
  movss  %xmm4,0xc(%rsp)
  add    $0x1,%ebx
  jne    L161
  jmp    L157
L52:
  and    $0xffffffdf,%ebx
  cmp    $0x45,%ebx
  jne    L157
  mov    $0x0,%ebp
L88:
  movsbl (%r12),%ebx
  cmp    $0x2b,%ebx
  je     L105
  lea    0x1(%r12),%r13
  mov    $0x1,%r14d
  cmp    $0x2d,%ebx
  je     L227
L53:
  mov    $0x0,%r12d
  jmp    L128
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D28
datatype: f64
name: extract_symbolic_data
arguments: data_label: D24
datatype: byte[4]
name: extract_symbolic_data
arguments: data_label: D7
datatype: f64

tool: D28: 10

tool: {"D24": [0x00,0x00,0x20,0x41]}

tool: D7: 0.1

assistant: ```c
float atof(char *s) {
  float a = 0.0;
  int e = 0;
  int c;
  while ((c = *s++) != '\0' && isdigit(c)) {
    a = a * 10.0 + (c - '0');
  }
  if (c == '.') {
    while ((c = *s++) != '\0' && isdigit(c)) {
      a = a * 10.0 + (c - '0');
      e = e - 1;
    }
  }
  if (c == 'e' || c == 'E') {
    int sign = 1;
    int i = 0;
    c = *s++;
    if (c == '+')
      c = *s++;
    else if (c == '-') {
      c = *s++;
      sign = -1;
    }
    while (isdigit(c)) {
      i = i * 10 + (c - '0');
      c = *s++;
    }
    e += i * sign;
  }
  while (e > 0) {
    a *= 10.0;
    e--;
  }
  while (e < 0) {
    a *= 0.1;
    e++;
  }
  return a;
}
```