user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<m_atof>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    $0x1,%ebp
  push   %rbx
  sub    $0x18,%rsp
  movsbl (%rdi),%ebx
  cmp    $0x2d,%bl
  jne    L140
  movsbl 0x1(%rdi),%ebx
  mov    $0xffffffff,%ebp
  add    $0x1,%rdi
L140:
  lea    0x1(%rdi),%r12
  pxor   %xmm1,%xmm1
  test   %ebx,%ebx
  jne    L198
  jmp    L91
  nopl   (%rax)
L161:
  sub    $0x30,%ebx
  pxor   %xmm0,%xmm0
  add    $0x1,%r12
  mulsd  D2(%rip),%xmm1
  cvtsi2sd %ebx,%xmm0
  movsbl -0x1(%r12),%ebx
  addsd  %xmm0,%xmm1
  test   %ebx,%ebx
  je     L91
L198:
  mov    %ebx,%edi
  movsd  %xmm1,0x8(%rsp)
  call   <isdigit@plt>
  movsd  0x8(%rsp),%xmm1
  test   %rax,%rax
  jne    L161
  cmp    $0x2e,%ebx
  jne    L126
  lea    0x1(%r12),%r13
  movsbl (%r12),%r12d
  xor    %ebx,%ebx
  test   %r12d,%r12d
  jne    L82
  jmp    L91
L53:
  sub    $0x30,%r12d
  pxor   %xmm0,%xmm0
  add    $0x1,%r13
  sub    $0x1,%ebx
  mulsd  D2(%rip),%xmm1
  cvtsi2sd %r12d,%xmm0
  movsbl -0x1(%r13),%r12d
  addsd  %xmm0,%xmm1
  test   %r12d,%r12d
  je     L175
L82:
  mov    %r12d,%edi
  movsd  %xmm1,0x8(%rsp)
  call   <isdigit@plt>
  movsd  0x8(%rsp),%xmm1
  test   %rax,%rax
  jne    L53
  and    $0xffffffdf,%r12d
  cmp    $0x45,%r12d
  jne    L146
L190:
  movsbl 0x0(%r13),%r12d
  cmp    $0x2b,%r12d
  je     L38
  lea    0x1(%r13),%r14
  mov    $0x1,%r15d
  cmp    $0x2d,%r12d
  jne    L94
  movsbl 0x1(%r13),%r12d
  lea    0x2(%r13),%r14
  mov    $0xffffffff,%r15d
L94:
  xor    %r13d,%r13d
  jmp    L16
  nopl   0x0(%rax,%rax,1)
L225:
  lea    0x0(%r13,%r13,4),%eax
  add    $0x1,%r14
  lea    -0x30(%r12,%rax,2),%r13d
  movsbl -0x1(%r14),%r12d
L16:
  mov    %r12d,%edi
  movsd  %xmm1,0x8(%rsp)
  call   <isdigit@plt>
  movsd  0x8(%rsp),%xmm1
  test   %rax,%rax
  jne    L225
  imul   %r15d,%r13d
  add    %r13d,%ebx
  test   %ebx,%ebx
  jle    L146
  movsd  D2(%rip),%xmm0
  nop
L44:
  mulsd  %xmm0,%xmm1
  sub    $0x1,%ebx
  jne    L44
L91:
  pxor   %xmm0,%xmm0
  add    $0x18,%rsp
  cvtsi2sd %ebp,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  mulsd  %xmm1,%xmm0
  ret
L146:
  test   %ebx,%ebx
  je     L91
L175:
  movsd  D30(%rip),%xmm0
L88:
  mulsd  %xmm0,%xmm1
  add    $0x1,%ebx
  jne    L88
  jmp    L91
  nopl   0x0(%rax,%rax,1)
L38:
  movsbl 0x1(%r13),%r12d
  lea    0x2(%r13),%r14
  mov    $0x1,%r15d
  jmp    L94
  nopl   0x0(%rax)
L126:
  and    $0xffffffdf,%ebx
  cmp    $0x45,%ebx
  jne    L91
  mov    %r12,%r13
  xor    %ebx,%ebx
  jmp    L190
```

tool_calls: name: extract_symbolic_data
arguments: tag: D2
datatype: f64
name: extract_symbolic_data
arguments: tag: D30
datatype: f64

tool: D2: 10

tool: D30: 0.1

assistant: ```c
double m_atof(char *s) {
  double a = 0.0;
  int e = 0;
  int c;
  int negative = 1;
  if (*s == '-') {
    negative = -1;
    s += 1;
  }
  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 * negative;
}
```