user: What is the c source code of the assembly code below?

```asm
<LongDiv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xff0,%rsp
  mov    %rdi,-0xfd8(%rbp)
  mov    %rsi,-0xfe0(%rbp)
  mov    %rdx,-0xfe8(%rbp)
  mov    %rcx,-0xff0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xff0(%rbp),%rdx
  mov    -0xfd8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Copy@plt>
  mov    -0xfe8(%rbp),%rax
  mov    %rax,%rdi
  call   <Initialize@plt>
  mov    -0xfe0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Compare@plt>
  cmp    $0xffffffff,%eax
  je     L54
  mov    -0xfe0(%rbp),%rax
  mov    %rax,%rdi
  call   <Degree@plt>
  mov    %eax,-0xfbc(%rbp)
  movl   $0x0,-0xfd0(%rbp)
  mov    -0xfbc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xfe0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xfc8(%rbp)
  jmp    L140
L149:
  shll   -0xfc8(%rbp)
  addl   $0x1,-0xfd0(%rbp)
L140:
  mov    -0xfc8(%rbp),%eax
  and    $0x8000,%eax
  test   %eax,%eax
  je     L149
  mov    -0xfd0(%rbp),%edx
  mov    -0xff0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <LeftShift@plt>
  mov    -0xfd0(%rbp),%edx
  mov    -0xfe0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <LeftShift@plt>
L182:
  mov    -0xff0(%rbp),%rax
  mov    %rax,%rdi
  call   <Degree@plt>
  mov    %eax,-0xfb8(%rbp)
  mov    -0xfb8(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xff0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0xfbc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0xfe0(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jb     L95
  lea    -0xfb0(%rbp),%rax
  mov    %rax,%rdi
  call   <Initialize@plt>
  movl   $0x0,-0xfcc(%rbp)
  jmp    L126
L107:
  mov    -0xfcc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xfe0(%rbp),%rax
  add    %rax,%rdx
  mov    -0xfb8(%rbp),%eax
  sub    -0xfbc(%rbp),%eax
  mov    %eax,%ecx
  mov    -0xfcc(%rbp),%eax
  add    %ecx,%eax
  mov    (%rdx),%edx
  cltq
  mov    %edx,-0xfb0(%rbp,%rax,4)
  addl   $0x1,-0xfcc(%rbp)
L126:
  mov    -0xfcc(%rbp),%eax
  cmp    -0xfbc(%rbp),%eax
  jle    L107
  lea    -0xfb0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Compare@plt>
  mov    %eax,-0xfb4(%rbp)
  cmpl   $0x1,-0xfb4(%rbp)
  je     L204
  cmpl   $0x0,-0xfb4(%rbp)
  jne    L139
L204:
  mov    -0xfb8(%rbp),%eax
  sub    -0xfbc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xfe8(%rbp),%rax
  add    %rdx,%rax
  movl   $0x1,(%rax)
  lea    -0xfb0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Sub@plt>
  jmp    L1
L139:
  lea    -0xfb0(%rbp),%rax
  mov    %rax,%rdi
  call   <Initialize@plt>
  lea    -0x7e0(%rbp),%rax
  mov    %rax,%rdi
  call   <Initialize@plt>
  movl   $0x0,-0xfcc(%rbp)
  jmp    L67
L102:
  mov    -0xfcc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xfe0(%rbp),%rax
  add    %rax,%rdx
  mov    -0xfb8(%rbp),%eax
  sub    -0xfbc(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0xfcc(%rbp),%eax
  add    %ecx,%eax
  mov    (%rdx),%edx
  cltq
  mov    %edx,-0xfb0(%rbp,%rax,4)
  addl   $0x1,-0xfcc(%rbp)
L67:
  mov    -0xfcc(%rbp),%eax
  cmp    -0xfbc(%rbp),%eax
  jle    L102
  lea    -0x7e0(%rbp),%rdx
  lea    -0xfb0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Copy@plt>
  movl   $0xffff,-0xfc4(%rbp)
  mov    -0xfc4(%rbp),%edx
  lea    -0xfb0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <Mul@plt>
L30:
  lea    -0xfb0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Compare@plt>
  mov    %eax,-0xfb4(%rbp)
  cmpl   $0x1,-0xfb4(%rbp)
  je     L125
  cmpl   $0x0,-0xfb4(%rbp)
  je     L125
  lea    -0x7e0(%rbp),%rdx
  lea    -0xfb0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Sub@plt>
  subl   $0x1,-0xfc4(%rbp)
  jmp    L30
L125:
  mov    -0xfb8(%rbp),%eax
  sub    -0xfbc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0xfe8(%rbp),%rax
  add    %rax,%rdx
  mov    -0xfc4(%rbp),%eax
  mov    %eax,(%rdx)
  lea    -0xfb0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Sub@plt>
  jmp    L1
L95:
  mov    -0xfb8(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xff0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  mov    %eax,%edx
  mov    -0xfb8(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rcx
  mov    -0xff0(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  add    %edx,%eax
  mov    %eax,-0xfc8(%rbp)
  mov    -0xfbc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xfe0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ecx
  mov    -0xfc8(%rbp),%eax
  mov    $0x0,%edx
  div    %ecx
  mov    %eax,-0xfc0(%rbp)
  lea    -0xfb0(%rbp),%rax
  mov    %rax,%rdi
  call   <Initialize@plt>
  lea    -0x7e0(%rbp),%rax
  mov    %rax,%rdi
  call   <Initialize@plt>
  movl   $0x0,-0xfcc(%rbp)
  jmp    L172
L220:
  mov    -0xfcc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xfe0(%rbp),%rax
  add    %rax,%rdx
  mov    -0xfb8(%rbp),%eax
  sub    -0xfbc(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0xfcc(%rbp),%eax
  add    %ecx,%eax
  mov    (%rdx),%edx
  cltq
  mov    %edx,-0xfb0(%rbp,%rax,4)
  addl   $0x1,-0xfcc(%rbp)
L172:
  mov    -0xfcc(%rbp),%eax
  cmp    -0xfbc(%rbp),%eax
  jle    L220
  lea    -0x7e0(%rbp),%rdx
  lea    -0xfb0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Copy@plt>
  mov    -0xfc0(%rbp),%edx
  lea    -0xfb0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <Mul@plt>
L154:
  lea    -0xfb0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Compare@plt>
  mov    %eax,-0xfb4(%rbp)
  cmpl   $0x1,-0xfb4(%rbp)
  je     L167
  cmpl   $0x0,-0xfb4(%rbp)
  je     L167
  lea    -0x7e0(%rbp),%rdx
  lea    -0xfb0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Sub@plt>
  subl   $0x1,-0xfc0(%rbp)
  jmp    L154
L167:
  mov    -0xfb8(%rbp),%eax
  sub    -0xfbc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0xfe8(%rbp),%rax
  add    %rax,%rdx
  mov    -0xfc0(%rbp),%eax
  mov    %eax,(%rdx)
  lea    -0xfb0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Sub@plt>
L1:
  mov    -0xfe0(%rbp),%rdx
  mov    -0xff0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <Compare@plt>
  mov    %eax,-0xfb4(%rbp)
  cmpl   $0xffffffff,-0xfb4(%rbp)
  je     L153
  jmp    L182
L153:
  nop
  mov    -0xfd0(%rbp),%edx
  mov    -0xff0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <RightShift@plt>
  mov    -0xfd0(%rbp),%edx
  mov    -0xfe0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <RightShift@plt>
  jmp    L209
L54:
  nop
L209:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L210
  call   <__stack_chk_fail@plt>
L210:
  leave
  ret
```

assistant: ```c
void LongDiv(unsigned a[], unsigned b[], unsigned quot[], unsigned res[]) {
  int s, t, k, sh;
  int i;
  unsigned x, D, Q;
  unsigned c[500], d[500];
  Copy(a, res);
  Initialize(quot);
  if (Compare(res, b) == -1)
    return;
  t = Degree(b);
  sh = 0;
  x = b[t];
  while ((x & (0x8000)) == 0) {
    x = x << 1;
    sh++;
  }
  LeftShift(res, sh);
  LeftShift(b, sh);
  while (1) {
    s = Degree(res);
    if (res[s] >= b[t]) {
      Initialize(c);
      for (i = 0; i <= t; i++)
        c[s - t + i] = b[i];
      k = Compare(res, c);
      if (k == 1 || k == 0) {
        quot[s - t] = 1;
        Sub(res, c);
      } else {
        Initialize(c);
        Initialize(d);
        for (i = 0; i <= t; i++)
          c[s - t - 1 + i] = b[i];
        Copy(c, d);
        D = 0xffff;
        Mul(c, D);
        while (1) {
          k = Compare(res, c);
          if (k == 1 || k == 0)
            break;
          Sub(c, d);
          D--;
        }
        quot[s - t - 1] = D;
        Sub(res, c);
      }
    } else {
      x = (res[s] << 16) + res[s - 1];
      Q = x / b[t];
      Initialize(c);
      Initialize(d);
      for (i = 0; i <= t; i++)
        c[s - t - 1 + i] = b[i];
      Copy(c, d);
      Mul(c, Q);
      while (1) {
        k = Compare(res, c);
        if (k == 1 || k == 0)
          break;
        Sub(c, d);
        Q--;
      }
      quot[s - t - 1] = Q;
      Sub(res, c);
    }
    k = Compare(res, b);
    if (k == -1)
      break;
  }
  RightShift(res, sh);
  RightShift(b, sh);
}
```