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

```asm
<flt_divide>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbp
  mov    (%rdx),%r9d
  mov    %r9d,%edi
  shr    $0x14,%edi
  and    $0x7ff,%edi
  je     L20
  mov    (%rsi),%eax
  mov    0x4(%rsi),%ecx
  mov    0x4(%rdx),%ebx
  mov    %eax,%r13d
  xor    %r9d,%r13d
  and    $0x80000000,%r13d
  mov    %eax,%r12d
  shr    $0x14,%r12d
  and    $0x7ff,%r12d
  je     L13
  and    $0xfffff,%eax
  or     $0x100000,%eax
  and    $0xfffff,%r9d
  or     $0x100000,%r9d
  sub    %edi,%r12d
  mov    %ebx,%r11d
  shr    $0x8,%r11d
  mov    $0x37,%r8d
  mov    $0x0,%edi
  mov    $0x0,%esi
  movzbl %bl,%r10d
  jmp    L154
L13:
  mov    %r13d,0x0(%rbp)
  movl   $0x0,0x4(%rbp)
  mov    $0x1,%edi
L20:
  mov    %edi,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L44:
  movzbl %cl,%edx
  sub    %r10d,%edx
  shr    $0x8,%ecx
  sub    %r11d,%ecx
  mov    %edx,%r14d
  sar    $0x8,%r14d
  add    %r14d,%ecx
  sub    %r9d,%eax
  mov    %ecx,%r14d
  sar    $0x18,%r14d
  add    %r14d,%eax
  shl    $0x8,%ecx
  movzbl %dl,%edx
  or     %edx,%ecx
  add    %esi,%esi
  mov    %edi,%edx
  shr    $0x1f,%edx
  or     %edx,%esi
  lea    0x1(%rdi,%rdi,1),%edi
L181:
  add    %eax,%eax
  mov    %ecx,%edx
  shr    $0x1f,%edx
  or     %edx,%eax
  add    %ecx,%ecx
  sub    $0x1,%r8d
  je     L97
L154:
  cmp    %eax,%r9d
  jb     L44
  jne    L140
  cmp    %ecx,%ebx
  jbe    L44
L140:
  add    %esi,%esi
  mov    %edi,%edx
  shr    $0x1f,%edx
  or     %edx,%esi
  add    %edi,%edi
  jmp    L181
L97:
  or     %ecx,%eax
  movzbl %al,%edx
  shr    $0x8,%eax
  or     %edx,%eax
  test   $0x400000,%esi
  jne    L7
  add    $0x3fe,%r12d
L70:
  mov    %edi,%ecx
  shl    $0x1f,%ecx
  shr    %edi
  mov    %esi,%edx
  shl    $0x1f,%edx
  or     %edi,%edx
  shr    %esi
  or     %eax,%ecx
  js     L54
L133:
  mov    $0x0,%edi
  cmp    $0x7fe,%r12d
  jg     L20
  test   %r12d,%r12d
  jle    L6
  and    $0xffefffff,%esi
  or     %r13d,%esi
  shl    $0x14,%r12d
  or     %r12d,%esi
  mov    %esi,0x0(%rbp)
  mov    %edx,0x4(%rbp)
  mov    $0x1,%edi
  jmp    L20
L7:
  mov    %edi,%edx
  and    $0x1,%edx
  or     %edx,%eax
  shr    %edi
  mov    %esi,%edx
  shl    $0x1f,%edx
  or     %edx,%edi
  shr    %esi
  add    $0x3ff,%r12d
  jmp    L70
L54:
  test   $0x1,%dl
  jne    L114
  cmp    $0x80000000,%ecx
  je     L133
L114:
  cmp    $0xffffffff,%edx
  je     L188
  add    $0x1,%edx
  jmp    L133
L188:
  add    $0x1,%esi
  mov    %esi,%edx
  and    $0x200000,%edx
  je     L133
  add    $0x1,%r12d
  mov    %r8d,%edx
  mov    $0x100000,%esi
  jmp    L133
L6:
  mov    %r13d,0x0(%rbp)
  movl   $0x0,0x4(%rbp)
  mov    $0x1,%edi
  jmp    L20
```

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;
}
```