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

```asm
<localCvtDoubleToExpNotationString>:
  endbr64
  push   %r14
  movapd %xmm0,%xmm2
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0xa0,%rsp
  andpd  D41(%rip),%xmm0
  movsd  D18(%rip),%xmm3
  mov    %fs:0x28,%rax
  mov    %rax,0x98(%rsp)
  xor    %eax,%eax
  comisd %xmm0,%xmm3
  ja     L124
  movsd  D30(%rip),%xmm1
  xor    %ebp,%ebp
  movsd  D20(%rip),%xmm3
  comisd %xmm1,%xmm0
  jb     L150
  nopl   0x0(%rax,%rax,1)
L114:
  mulsd  %xmm3,%xmm0
  add    $0x3,%ebp
  comisd %xmm1,%xmm0
  jae    L114
  mov    %ebp,%eax
  mov    $0xcccccccd,%edx
  imul   %rdx,%rax
  shr    $0x23,%rax
  lea    0x30(%rax),%r12d
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%ebp
  add    $0x30,%ebp
L179:
  lea    0x10(%rsp),%r13
  movzwl %si,%esi
  movsd  %xmm2,0x8(%rsp)
  mov    %r13,%rdi
  call   <localCvtDoubleToString@plt>
  movsd  0x8(%rsp),%xmm2
  pxor   %xmm0,%xmm0
  comisd %xmm2,%xmm0
  ja     L31
  mov    %rbx,%rsi
  mov    $0x1,%eax
  xor    %ecx,%ecx
L58:
  movzbl 0x10(%rsp),%edx
  test   %dl,%dl
  je     L63
  lea    0x1(%rcx),%eax
  mov    %r13,%rsi
  cltq
  sub    %rcx,%rsi
  nopw   0x0(%rax,%rax,1)
L74:
  mov    %dl,-0x1(%rbx,%rax,1)
  mov    %eax,%ecx
  add    $0x1,%rax
  movzbl -0x1(%rsi,%rax,1),%edx
  test   %dl,%dl
  jne    L74
  movslq %ecx,%rsi
  lea    0x1(%rcx),%eax
  add    %rbx,%rsi
  cltq
L63:
  movb   $0x65,(%rsi)
  movb   $0x2b,(%rbx,%rax,1)
  lea    0x2(%rcx),%eax
  cltq
  mov    %r12b,(%rbx,%rax,1)
L115:
  lea    0x3(%rcx),%eax
  add    $0x4,%ecx
  cltq
  movslq %ecx,%rcx
  mov    %bpl,(%rbx,%rax,1)
  movb   $0x0,(%rbx,%rcx,1)
  mov    0x98(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L96
  add    $0xa0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L31:
  movb   $0x2d,(%rbx)
  lea    0x1(%rbx),%rsi
  mov    $0x2,%eax
  mov    $0x1,%ecx
  jmp    L58
  cs nopw 0x0(%rax,%rax,1)
L124:
  pxor   %xmm4,%xmm4
  ucomisd %xmm4,%xmm2
  jp     L48
  je     L64
L48:
  movsd  D30(%rip),%xmm1
  xor    %r12d,%r12d
  nopl   0x0(%rax,%rax,1)
L85:
  mulsd  %xmm1,%xmm0
  add    $0x3,%r12d
  comisd %xmm0,%xmm3
  ja     L85
  mov    %r12d,%eax
  mov    $0xcccccccd,%edx
  mov    %r12d,%ebp
  imul   %rdx,%rax
  shr    $0x23,%rax
  lea    0x30(%rax),%r14d
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%ebp
  add    $0x30,%ebp
L35:
  lea    0x10(%rsp),%r13
  movzwl %si,%esi
  movsd  %xmm2,0x8(%rsp)
  mov    %r13,%rdi
  call   <localCvtDoubleToString@plt>
  movsd  0x8(%rsp),%xmm2
  pxor   %xmm5,%xmm5
  comisd %xmm2,%xmm5
  ja     L102
  mov    %rbx,%rdi
  mov    $0x1,%esi
  xor    %ecx,%ecx
L101:
  movzbl 0x10(%rsp),%edx
  test   %dl,%dl
  je     L69
  lea    0x1(%rcx),%eax
  mov    %r13,%rsi
  cltq
  sub    %rcx,%rsi
  nopw   0x0(%rax,%rax,1)
L171:
  mov    %dl,-0x1(%rbx,%rax,1)
  mov    %eax,%ecx
  add    $0x1,%rax
  movzbl -0x1(%rsi,%rax,1),%edx
  test   %dl,%dl
  jne    L171
  movslq %ecx,%rdi
  lea    0x1(%rcx),%esi
  add    %rbx,%rdi
  movslq %esi,%rsi
L69:
  cmp    $0x1,%r12d
  lea    0x2(%rcx),%edx
  movb   $0x65,(%rdi)
  sbb    %eax,%eax
  and    $0xfffffffe,%eax
  add    $0x2d,%eax
  mov    %al,(%rbx,%rsi,1)
  movslq %edx,%rax
  mov    %r14b,(%rbx,%rax,1)
  jmp    L115
L64:
  mov    $0x30,%ebp
  mov    $0x30,%r14d
  xor    %r12d,%r12d
  jmp    L35
  nopl   0x0(%rax,%rax,1)
L102:
  movb   $0x2d,(%rbx)
  lea    0x1(%rbx),%rdi
  mov    $0x2,%esi
  mov    $0x1,%ecx
  jmp    L101
  xchg   %ax,%ax
L150:
  mov    $0x30,%ebp
  mov    $0x30,%r12d
  jmp    L179
L96:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D41
type_guessed: qword[2]
name: disassemble_data
arguments: label: D18
type_guessed: f64
name: disassemble_data
arguments: label: D30
type_guessed: f64
name: disassemble_data
arguments: label: D20
type_guessed: f64

tool: {"D41": [0x7fffffffffffffff,0x0000000000000000]}

tool: D18: 1

tool: D30: 1000

tool: D20: 0.001

assistant: ```c
void localCvtDoubleToExpNotationString(double value, char *textField, unsigned short precision) {
  double absVal, newVal;
  int minus;
  int exp, k, l;
  char TF[128];
  absVal = fabs(value);
  minus = (value < 0.0 ? 1 : 0);
  newVal = absVal;
  if (absVal < 1.) {
    exp = 0;
    if (absVal != 0.) {
      do {
        newVal *= 1000.0;
        exp += 3;
      } while (newVal < 1.);
    }
    localCvtDoubleToString(newVal, TF, precision);
    k = 0;
    l = 0;
    if (minus)
      textField[k++] = '-';
    while (TF[l] != '\0')
      textField[k++] = TF[l++];
    textField[k++] = 'e';
    if (exp == 0) {
      textField[k++] = '+';
    } else {
      textField[k++] = '-';
    }
    textField[k++] = '0' + exp / 10;
    textField[k++] = '0' + exp % 10;
    textField[k++] = '\0';
  } else {
    exp = 0;
    while (newVal >= 1000.) {
      newVal *= 0.001;
      exp += 3;
    }
    localCvtDoubleToString(newVal, TF, precision);
    k = 0;
    l = 0;
    if (minus)
      textField[k++] = '-';
    while (TF[l] != '\0')
      textField[k++] = TF[l++];
    textField[k++] = 'e';
    textField[k++] = '+';
    textField[k++] = '0' + exp / 10;
    textField[k++] = '0' + exp % 10;
    textField[k++] = '\0';
  }
}
```