user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<fltrep_stod>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  movl   $0x0,-0x3c(%rbp)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x2b,-0x14(%rbp)
  je     L455
  cmpl   $0x2d,-0x14(%rbp)
  jne    L230
  movl   $0x80000000,-0x3c(%rbp)
L455:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
L230:
  nop
  movl   $0x0,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x38(%rbp)
  movl   $0x100000,-0x28(%rbp)
  movl   $0x0,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  jmp    L367
L57:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
L367:
  cmpl   $0x30,-0x14(%rbp)
  je     L57
  cmpl   $0x2e,-0x14(%rbp)
  jne    L298
  movl   $0x1,-0x10(%rbp)
  jmp    L67
L416:
  subl   $0x1,-0x1c(%rbp)
L67:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x30,-0x14(%rbp)
  je     L416
L298:
  cmpl   $0x0,-0x10(%rbp)
  jne    L99
  cmpl   $0x2e,-0x14(%rbp)
  jne    L99
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
  movl   $0x1,-0x10(%rbp)
  jmp    L445
L99:
  mov    -0x14(%rbp),%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L202
  mov    -0x28(%rbp),%ecx
  movslq %ecx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %ecx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  shl    $0x18,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x4(%rbp),%ecx
  movslq %ecx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %ecx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  shl    $0x18,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x20(%rbp)
  subl   $0x30,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  imul   -0x20(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x14(%rbp),%eax
  imul   -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  shr    $0x18,%eax
  add    %edx,%eax
  add    %eax,-0x34(%rbp)
  mov    -0x14(%rbp),%eax
  imul   -0x28(%rbp),%eax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  shr    $0x18,%eax
  add    %edx,%eax
  add    %eax,-0x38(%rbp)
  andl   $0xffffff,-0x30(%rbp)
  andl   $0xffffff,-0x34(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jne    L94
  addl   $0x1,-0x1c(%rbp)
L94:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
L445:
  jmp    L298
L202:
  nop
  cmpl   $0x0,-0x38(%rbp)
  jne    L1
  mov    -0x50(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  movl   $0x0,(%rax)
  mov    -0x50(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  movl   $0x0,(%rax)
  jmp    L138
L1:
  cmpl   $0x65,-0x14(%rbp)
  je     L98
  cmpl   $0x45,-0x14(%rbp)
  jne    L140
L98:
  movl   $0x0,-0xc(%rbp)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x2b,-0x14(%rbp)
  je     L252
  cmpl   $0x2d,-0x14(%rbp)
  jne    L274
  movl   $0x1,-0xc(%rbp)
L252:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
L274:
  nop
  jmp    L380
L103:
  mov    -0x18(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    $0x30,%eax
  add    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
L380:
  mov    -0x14(%rbp),%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  jbe    L103
  cmpl   $0x0,-0xc(%rbp)
  je     L32
  mov    -0x18(%rbp),%eax
  sub    %eax,-0x1c(%rbp)
  jmp    L140
L32:
  mov    -0x18(%rbp),%eax
  add    %eax,-0x1c(%rbp)
L140:
  cmpl   $0x0,-0x1c(%rbp)
  jle    L77
  jmp    L458
L187:
  mov    -0x30(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  shr    $0x18,%eax
  add    %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x38(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  shr    $0x18,%eax
  add    %edx,%eax
  mov    %eax,-0x38(%rbp)
  andl   $0xffffff,-0x30(%rbp)
  andl   $0xffffff,-0x34(%rbp)
  jmp    L261
L340:
  mov    -0x30(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  shl    $0x17,%eax
  and    $0x800000,%eax
  or     %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%eax
  shl    $0x17,%eax
  and    $0x800000,%eax
  or     %edx,%eax
  mov    %eax,-0x34(%rbp)
  sarl   -0x38(%rbp)
  addl   $0x1,-0x2c(%rbp)
L261:
  mov    -0x38(%rbp),%eax
  and    $0xffe00000,%eax
  test   %eax,%eax
  jne    L340
  subl   $0x1,-0x1c(%rbp)
L458:
  cmpl   $0x0,-0x1c(%rbp)
  jg     L187
  jmp    L351
L77:
  cmpl   $0x0,-0x1c(%rbp)
  jns    L351
  jmp    L448
L415:
  mov    -0x38(%rbp),%ecx
  movslq %ecx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %ecx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  shl    $0x18,%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x38(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x8(%rbp),%ecx
  movslq %ecx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %ecx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  shl    $0x18,%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  shr    $0x18,%eax
  add    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%eax
  shr    $0x18,%eax
  add    %eax,-0x38(%rbp)
  andl   $0xffffff,-0x30(%rbp)
  andl   $0xffffff,-0x34(%rbp)
  jmp    L113
L48:
  mov    -0x38(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x34(%rbp),%eax
  sar    $0x17,%eax
  and    $0x1,%eax
  or     %edx,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x34(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x30(%rbp),%eax
  sar    $0x17,%eax
  and    $0x1,%eax
  or     %edx,%eax
  and    $0xffffff,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x30(%rbp),%eax
  add    %eax,%eax
  and    $0xffffff,%eax
  mov    %eax,-0x30(%rbp)
  subl   $0x1,-0x2c(%rbp)
L113:
  mov    -0x38(%rbp),%eax
  and    $0xfff00000,%eax
  test   %eax,%eax
  je     L48
  addl   $0x1,-0x1c(%rbp)
L448:
  cmpl   $0x0,-0x1c(%rbp)
  js     L415
  jmp    L351
L144:
  mov    -0x38(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x34(%rbp),%eax
  sar    $0x17,%eax
  and    $0x1,%eax
  or     %edx,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x34(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x30(%rbp),%eax
  sar    $0x17,%eax
  and    $0x1,%eax
  or     %edx,%eax
  and    $0xffffff,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x30(%rbp),%eax
  add    %eax,%eax
  and    $0xffffff,%eax
  mov    %eax,-0x30(%rbp)
  subl   $0x1,-0x2c(%rbp)
L351:
  mov    -0x38(%rbp),%eax
  and    $0xfff00000,%eax
  test   %eax,%eax
  je     L144
  jmp    L402
L89:
  mov    -0x30(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  shl    $0x17,%eax
  and    $0x800000,%eax
  or     %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%eax
  shl    $0x17,%eax
  and    $0x800000,%eax
  or     %edx,%eax
  mov    %eax,-0x34(%rbp)
  sarl   -0x38(%rbp)
  addl   $0x1,-0x2c(%rbp)
L402:
  mov    -0x38(%rbp),%eax
  and    $0xffe00000,%eax
  test   %eax,%eax
  jne    L89
  mov    -0x30(%rbp),%eax
  and    $0xff00,%eax
  cmp    $0x8000,%eax
  jle    L190
  addl   $0x10000,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  shr    $0x18,%eax
  add    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%eax
  shr    $0x18,%eax
  add    %eax,-0x38(%rbp)
  andl   $0xff0000,-0x30(%rbp)
  andl   $0xffffff,-0x34(%rbp)
  jmp    L2
L190:
  mov    -0x30(%rbp),%eax
  and    $0xff00,%eax
  cmp    $0x8000,%eax
  jne    L363
  andl   $0xfe0000,-0x30(%rbp)
  jmp    L363
L2:
  jmp    L351
L363:
  nop
  addl   $0x3ff,-0x2c(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  jg     L364
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cc_rerr@plt>
  mov    -0x50(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  movl   $0x0,(%rax)
  mov    -0x50(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  movl   $0x0,(%rax)
  jmp    L138
L364:
  cmpl   $0x7ff,-0x2c(%rbp)
  jle    L420
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cc_err@plt>
  movl   $0x7ff,-0x2c(%rbp)
  movl   $0x0,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x38(%rbp)
L420:
  mov    -0x2c(%rbp),%eax
  shl    $0x14,%eax
  or     -0x3c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%eax
  and    $0xfffff,%eax
  or     %edx,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x34(%rbp),%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  sar    $0x10,%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x50(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  mov    -0x38(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x50(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  mov    -0x34(%rbp),%edx
  mov    %edx,(%rax)
  nop
L138:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D4
type_guessed: string
name: unpack_data
arguments: data_tag: D7
type_guessed: string

tool: D4: Small floating point value converted to 0.0

tool: D7: Overlarge floating point value found

assistant: ```c
void fltrep_stod(s, p) char *s;
int *p;
{
  int ds, dh, dm, dl, bx;
  int th, tm, tl, x, x1, ch, dot;
  ds = 0;
  switch (ch = *s++) {
  case '-':
    ds = 0x80000000;
  case '+':
    ch = *s++;
  default:
    break;
  }
  dh = dm = dl = bx = 0;
  th = 0x00100000;
  tm = tl = x = x1 = dot = 0;
  while (ch == '0')
    ch = *s++;
  if (ch == '.') {
    dot = 1;
    while ((ch = *s++) == '0')
      x -= 1;
  }
  while (1) {
    if (!dot && ch == '.')
      ch = *s++, dot = 1;
    else if (isdigit(ch)) {
      int carry = ((th % 10) << 24) + tm;
      th = th / 10;
      tm = carry / 10;
      tl = (((carry % 10) << 24) + tl) / 10;
      ch = ((ch) - '0');
      dl += ch * tl;
      dm += ch * tm + ((dl >> 24) & 0xff);
      dh += ch * th + ((dm >> 24) & 0xff);
      dl &= 0x00ffffff;
      dm &= 0x00ffffff;
      if (!dot)
        x += 1;
      ch = *s++;
    } else
      break;
  }
  if (dh == 0) {
    *p++ = 0;
    *p++ = 0;
    return;
  }
  if (ch == 'e' || ch == 'E') {
    int sx = 0;
    switch (ch = *s++) {
    case '-':
      sx = 1;
    case '+':
      ch = *s++;
    default:
      break;
    }
    while (isdigit(ch)) {
      x1 = 10 * x1 + ((ch) - '0');
      ch = *s++;
    }
    if (sx)
      x -= x1;
    else
      x += x1;
  }
  if (x > 0) {
    while (x > 0) {
      dl *= 10;
      dm = 10 * dm + ((dl >> 24) & 0xff);
      dh = 10 * dh + ((dm >> 24) & 0xff);
      dl &= 0x00ffffff;
      dm &= 0x00ffffff;
      while ((dh & 0xffe00000) != 0) {
        dl = (dl >> 1) | ((dm & 1) << 23);
        dm = (dm >> 1) | ((dh & 1) << 23);
        dh = dh >> 1;
        bx += 1;
      }
      x -= 1;
    }
  } else if (x < 0) {
    while (x < 0) {
      int carry = ((dh % 10) << 24) + dm;
      dh /= 10;
      dm = carry / 10;
      dl = (dl + ((carry % 10) << 24)) / 10;
      dm += ((dl >> 24) & 0xff);
      dh += ((dm >> 24) & 0xff);
      dl &= 0x00ffffff;
      dm &= 0x00ffffff;
      while ((dh & 0xfff00000) == 0) {
        dh = (dh << 1) | ((dm >> 23) & 1);
        dm = ((dm << 1) | ((dl >> 23) & 1)) & 0x00ffffff;
        dl = (dl << 1) & 0x00ffffff;
        bx -= 1;
      }
      x += 1;
    }
  }
  for (;;) {
    while ((dh & 0xfff00000) == 0) {
      dh = (dh << 1) | ((dm >> 23) & 1);
      dm = ((dm << 1) | ((dl >> 23) & 1)) & 0x00ffffff;
      dl = (dl << 1) & 0x00ffffff;
      bx -= 1;
    }
    while ((dh & 0xffe00000) != 0) {
      dl = (dl >> 1) | ((dm & 1) << 23);
      dm = (dm >> 1) | ((dh & 1) << 23);
      dh = dh >> 1;
      bx += 1;
    }
    if ((dl & 0xff00) > 0x8000) {
      dl += 0x00010000;
      dm += (dl >> 24) & 0xff;
      dh += (dm >> 24) & 0xff;
      dl &= 0x00ff0000;
      dm &= 0x00ffffff;
      continue;
    } else if ((dl & 0xff00) == 0x8000)
      dl &= 0x00fe0000;
    break;
  }
  bx += 0x3ff;
  if (bx <= 0) {
    cc_rerr("Small floating point value converted to 0.0");
    *p++ = 0;
    *p++ = 0;
    return;
  }
  if (bx > 0x7ff) {
    cc_err("Overlarge floating point value found");
    bx = 0x7ff;
    dh = dm = dl = 0;
  }
  dh = ds | (bx << 20) | (dh & 0x000fffff);
  dm = (dm << 8) | ((dl >> 16) & 0xff);
  *p++ = dh;
  *p++ = dm;
  return;
}
```