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

```asm
<atof>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%r13
  mov    %rdi,%rbx
  mov    $0x0,%r12d
  jmp    L123
L192:
  add    $0x1,%r12d
L123:
  mov    %rbx,%rbp
  movsbl (%rbx),%edi
  call   <isspace@plt>
  add    $0x1,%rbx
  test   %rax,%rax
  jne    L192
  movzbl 0x0(%rbp),%eax
  cmp    $0x2d,%al
  je     L58
  sub    $0x2b,%eax
  movl   $0x1,0xc(%rsp)
  test   $0xfd,%al
  je     L61
L93:
  movslq %r12d,%r14
  add    %r13,%r14
  mov    %r14,%rbx
  pxor   %xmm4,%xmm4
  movsd  %xmm4,(%rsp)
  jmp    L18
L58:
  movl   $0xffffffff,0xc(%rsp)
L61:
  add    $0x1,%r12d
  jmp    L93
L0:
  movsd  (%rsp),%xmm0
  mulsd  D111(%rip),%xmm0
  movsbl (%rbx),%eax
  sub    $0x30,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,(%rsp)
  add    $0x1,%rbx
L18:
  mov    %r12d,%ebp
  sub    %r14d,%ebp
  add    %ebx,%ebp
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L0
  movzbl (%rbx),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L227
  lea    0x1(%rbp),%ebx
  movslq %ebx,%rax
  movzbl 0x0(%r13,%rax,1),%eax
  cmp    $0x2d,%al
  je     L208
  sub    $0x2b,%eax
  mov    $0x1,%r14d
  test   $0xfd,%al
  je     L246
L183:
  movslq %ebx,%rbx
  mov    D66(%rip),%r12
L197:
  mov    %ebx,%ebp
  movsbl 0x0(%r13,%rbx,1),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L4
  movq   %r12,%xmm0
  mulsd  D111(%rip),%xmm0
  movsbl 0x0(%r13,%rbx,1),%eax
  sub    $0x30,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movq   %xmm1,%r12
  add    $0x1,%rbx
  jmp    L197
L208:
  mov    $0xffffffff,%r14d
L246:
  lea    0x2(%rbp),%ebx
  jmp    L183
L4:
  pxor   %xmm0,%xmm0
  cvtsi2sd %r14d,%xmm0
  movq   %r12,%xmm7
  mulsd  %xmm0,%xmm7
  movq   %xmm7,%r14
  movslq %ebx,%rax
  mov    D12(%rip),%r12
  cmpb   $0x2e,0x0(%r13,%rax,1)
  jne    L162
L175:
  lea    0x1(%rbp),%ebx
  movslq %ebx,%rbx
  mov    D12(%rip),%r12
  jmp    L218
L43:
  mov    D66(%rip),%r14
  jmp    L175
L143:
  movsd  (%rsp),%xmm0
  mulsd  D111(%rip),%xmm0
  movsbl 0x0(%r13,%rbx,1),%eax
  sub    $0x30,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,(%rsp)
  movq   %r12,%xmm2
  mulsd  D111(%rip),%xmm2
  movq   %xmm2,%r12
  add    $0x1,%rbx
L218:
  mov    %ebx,%ebp
  movsbl 0x0(%r13,%rbx,1),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L143
L162:
  movslq %ebp,%rax
  movzbl 0x0(%r13,%rax,1),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L148
  lea    0x1(%rbp),%eax
  movslq %eax,%rdx
  movzbl 0x0(%r13,%rdx,1),%edx
  cmp    $0x2d,%dl
  je     L38
  sub    $0x2b,%edx
  mov    $0x1,%ebx
  test   $0xfd,%dl
  je     L86
L147:
  movslq %eax,%rbp
  add    %r13,%rbp
  mov    D66(%rip),%r14
L114:
  movsbl 0x0(%rbp),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L146
  movq   %r14,%xmm0
  mulsd  D111(%rip),%xmm0
  movsbl 0x0(%rbp),%eax
  sub    $0x30,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movq   %xmm1,%r14
  add    $0x1,%rbp
  jmp    L114
L38:
  mov    $0xffffffff,%ebx
L86:
  lea    0x2(%rbp),%eax
  jmp    L147
L146:
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  movq   %r14,%xmm7
  mulsd  %xmm0,%xmm7
  movq   %xmm7,%r14
L148:
  pxor   %xmm0,%xmm0
  cvtsi2sdl 0xc(%rsp),%xmm0
  mulsd  (%rsp),%xmm0
  movq   %r12,%xmm6
  divsd  %xmm6,%xmm0
  movsd  %xmm0,(%rsp)
  movq   %r14,%xmm1
  movsd  D111(%rip),%xmm0
  call   <pow@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  (%rsp),%xmm0
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L227:
  movslq %ebp,%rax
  cmpb   $0x2e,0x0(%r13,%rax,1)
  je     L43
  mov    D12(%rip),%r12
  mov    D66(%rip),%r14
  jmp    L148
```

tool_calls: name: read_data
arguments: label: D111
data_type: f64
name: read_data
arguments: label: D66
data_type: f64
name: read_data
arguments: label: D12
data_type: f64

tool: D111: 10

tool: D66: 0

tool: D12: 1

assistant: ```c
double atof(char s[]) {
  double value = 0.0;
  double fractional_power = 1.0;
  int sign = 1;
  int str_index = 0;
  double power_of_ten = 0.0;
  for (str_index = 0; isspace(s[str_index]); ++str_index) {
  }
  sign = (s[str_index] == '-' ? -1 : 1);
  if (s[str_index] == '-' || s[str_index] == '+') {
    ++str_index;
  }
  for (value = 0.0; isdigit(s[str_index]); ++str_index) {
    value = value * 10.0 + (s[str_index] - '0');
  }
  if (s[str_index] == 'e' || s[str_index] == 'E') {
    ++str_index;
    int power_of_ten_sign = (s[str_index] == '-' ? -1 : 1);
    if (s[str_index] == '+' || s[str_index] == '-') {
      ++str_index;
    }
    for (power_of_ten = 0.0; isdigit(s[str_index]); ++str_index) {
      power_of_ten = power_of_ten * 10.0 + (s[str_index] - '0');
    }
    power_of_ten *= power_of_ten_sign;
  }
  if (s[str_index] == '.') {
    ++str_index;
    for (fractional_power = 1.0; isdigit(s[str_index]); ++str_index) {
      value = value * 10.0 + (s[str_index] - '0');
      fractional_power *= 10.0;
    }
  }
  if (s[str_index] == 'e' || s[str_index] == 'E') {
    ++str_index;
    int power_of_ten_sign = (s[str_index] == '-' ? -1 : 1);
    if (s[str_index] == '+' || s[str_index] == '-') {
      ++str_index;
    }
    for (power_of_ten = 0.0; isdigit(s[str_index]); ++str_index) {
      power_of_ten = power_of_ten * 10.0 + (s[str_index] - '0');
    }
    power_of_ten *= power_of_ten_sign;
  }
  return (sign * value / fractional_power) * pow(10.0, power_of_ten);
}
```