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

```asm
<flt_divide>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x48(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x30(%rbp),%eax
  xor    -0x18(%rbp),%eax
  and    $0x80000000,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x30(%rbp),%eax
  shr    $0x14,%eax
  and    $0x7ff,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%eax
  shr    $0x14,%eax
  and    $0x7ff,%eax
  mov    %eax,-0x8(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  jne    L111
  mov    $0x0,%eax
  jmp    L200
L111:
  cmpl   $0x0,-0xc(%rbp)
  jne    L8
  mov    -0x38(%rbp),%rax
  mov    -0x10(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movl   $0x0,(%rax)
  mov    $0x1,%eax
  jmp    L200
L8:
  mov    -0x30(%rbp),%eax
  and    $0xfffff,%eax
  or     $0x100000,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x18(%rbp),%eax
  and    $0xfffff,%eax
  or     $0x100000,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0xc(%rbp),%eax
  sub    -0x8(%rbp),%eax
  add    $0x3fe,%eax
  mov    %eax,-0x20(%rbp)
  movl   $0x0,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L95
L136:
  mov    -0x30(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  ja     L89
  mov    -0x30(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jne    L22
  mov    -0x2c(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jb     L22
L89:
  mov    -0x2c(%rbp),%eax
  movzbl %al,%eax
  mov    -0x14(%rbp),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x2c(%rbp),%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  shr    $0x8,%eax
  sub    %eax,%edx
  mov    -0x4(%rbp),%eax
  sar    $0x8,%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  sub    -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  sar    $0x18,%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x28(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x24(%rbp),%eax
  shr    $0x1f,%eax
  or     %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  or     $0x1,%eax
  mov    %eax,-0x24(%rbp)
  jmp    L202
L22:
  mov    -0x28(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x24(%rbp),%eax
  shr    $0x1f,%eax
  or     %edx,%eax
  mov    %eax,-0x28(%rbp)
  shll   -0x24(%rbp)
L202:
  mov    -0x30(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x2c(%rbp),%eax
  shr    $0x1f,%eax
  or     %edx,%eax
  mov    %eax,-0x30(%rbp)
  shll   -0x2c(%rbp)
  addl   $0x1,-0x1c(%rbp)
L95:
  cmpl   $0x36,-0x1c(%rbp)
  jle    L136
  mov    -0x2c(%rbp),%eax
  or     %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  movzbl %al,%edx
  mov    -0x30(%rbp),%eax
  shr    $0x8,%eax
  or     %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x28(%rbp),%eax
  and    $0x400000,%eax
  test   %eax,%eax
  je     L127
  mov    -0x24(%rbp),%eax
  and    $0x1,%eax
  or     %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  shr    %eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  shl    $0x1f,%eax
  or     %edx,%eax
  mov    %eax,-0x24(%rbp)
  shrl   -0x28(%rbp)
  addl   $0x1,-0x20(%rbp)
L127:
  mov    -0x24(%rbp),%eax
  shl    $0x1f,%eax
  or     %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  shr    %eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  shl    $0x1f,%eax
  or     %edx,%eax
  mov    %eax,-0x24(%rbp)
  shrl   -0x28(%rbp)
  mov    -0x30(%rbp),%eax
  test   %eax,%eax
  jns    L167
  mov    -0x24(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  jne    L147
  cmpl   $0x80000000,-0x30(%rbp)
  je     L167
L147:
  cmpl   $0xffffffff,-0x24(%rbp)
  jne    L48
  movl   $0x0,-0x24(%rbp)
  addl   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  and    $0x200000,%eax
  test   %eax,%eax
  je     L167
  movl   $0x100000,-0x28(%rbp)
  addl   $0x1,-0x20(%rbp)
  jmp    L167
L48:
  addl   $0x1,-0x24(%rbp)
L167:
  cmpl   $0x7fe,-0x20(%rbp)
  jle    L207
  mov    $0x0,%eax
  jmp    L200
L207:
  cmpl   $0x0,-0x20(%rbp)
  jg     L106
  mov    -0x38(%rbp),%rax
  mov    -0x10(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movl   $0x0,(%rax)
  mov    $0x1,%eax
  jmp    L200
L106:
  mov    -0x28(%rbp),%eax
  and    $0xffefffff,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%eax
  shl    $0x14,%eax
  or     %edx,%eax
  or     -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x24(%rbp),%eax
  mov    %eax,(%rdx)
  mov    $0x1,%eax
L200:
  pop    %rbp
  ret
```

assistant: ```c
int flt_divide(a, b, c)
double *a;
double *b;
double *c;
{
  unsigned int bh = ((unsigned int *)b)[0];
  unsigned int bl = ((unsigned int *)b)[1];
  unsigned int ch = ((unsigned int *)c)[0];
  unsigned int cl = ((unsigned int *)c)[1];
  unsigned int ah, al, as = (bh ^ ch) & 0x80000000;
  int ax, bx, cx, i;
  bx = (bh >> 20) & 0x7ff;
  cx = (ch >> 20) & 0x7ff;
  if (cx == 0)
    return 0;
  if (bx == 0) {
    ((unsigned int *)a)[0] = as;
    ((unsigned int *)a)[1] = 0;
    return 1;
  }
  bh = (bh & 0xfffff) | 0x00100000;
  ch = (ch & 0xfffff) | 0x00100000;
  ax = bx - cx + 0x3fe;
  ah = al = 0;
  for (i = 0; i < 55; i++) {
    if (bh > ch || (bh == ch && bl >= cl)) {
      unsigned int w = (bl & 0xff) - (cl & 0xff);
      bl = (bl >> 8) - (cl >> 8) + ((int)w >> 8);
      bh = bh - ch + (((int)bl) >> 24);
      bl = (bl << 8) | (w & 0xff);
      ah = (ah << 1) | (al >> 31);
      al = (al << 1) | 1;
    } else {
      ah = (ah << 1) | (al >> 31);
      al = al << 1;
    }
    bh = (bh << 1) | (bl >> 31);
    bl = bl << 1;
  }
  bh |= bl;
  bh = (bh & 0xff) | (bh >> 8);
  if (ah & 0x00400000) {
    bh |= al & 1;
    al = (al >> 1) | (ah << 31);
    ah = ah >> 1;
    ax += 1;
  }
  bh = bh | (al << 31);
  al = (al >> 1) | (ah << 31);
  ah = ah >> 1;
  if ((bh & 0x80000000) && ((al & 1) != 0 || bh != 0x80000000)) {
    if (al == 0xffffffff) {
      al = 0;
      ah += 1;
      if (ah & 0x00200000) {
        ah = 0x00100000;
        ax += 1;
      }
    } else
      al += 1;
  }
  if (ax >= 0x7ff)
    return 0;
  else if (ax <= 0) {
    ((unsigned int *)a)[0] = as;
    ((unsigned int *)a)[1] = 0;
    return 1;
  }
  ((int *)a)[0] = (ah & ~0x00100000) | (ax << 20) | as;
  ((int *)a)[1] = al;
  return 1;
}
```