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

```asm
<divide_polynomial>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %rcx,-0x70(%rbp)
  mov    %r8,-0x78(%rbp)
  mov    %r9,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  cmp    -0x78(%rbp),%rax
  jbe    L89
  movl   $0x0,-0x40(%rbp)
  jmp    L51
L110:
  mov    -0x40(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    -0x40(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x70(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x40(%rbp)
L51:
  mov    -0x40(%rbp),%eax
  cltq
  cmp    %rax,-0x78(%rbp)
  ja     L110
  jmp    L101
L89:
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  jne    L57
  mov    $0x0,%eax
  call   <abort@plt>
L57:
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x28(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  jne    L134
  mov    $0x0,%eax
  call   <abort@plt>
L134:
  mov    -0x78(%rbp),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  sub    $0x1,%rax
  imul   -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x20(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  jne    L117
  mov    $0x0,%eax
  call   <abort@plt>
L117:
  mov    -0x78(%rbp),%rax
  sub    -0x80(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x78(%rbp),%rax
  lea    -0x1(%rax),%rcx
  mov    -0x80(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdi
  call   <gen_conv_matrix@plt>
L75:
  mov    -0x78(%rbp),%rdi
  mov    -0x18(%rbp),%rcx
  mov    -0x68(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x30(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <inner_product_set@plt>
  movl   $0x0,-0x3c(%rbp)
  jmp    L142
L162:
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x58(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    -0x3c(%rbp),%ecx
  movslq %ecx,%rsi
  mov    -0x28(%rbp),%rcx
  lea    (%rsi,%rcx,1),%rbx
  mov    %edx,%esi
  mov    %eax,%edi
  call   <sum@plt>
  mov    %al,(%rbx)
  addl   $0x1,-0x3c(%rbp)
L142:
  mov    -0x3c(%rbp),%eax
  cltq
  cmp    %rax,-0x78(%rbp)
  ja     L162
  mov    -0x78(%rbp),%rax
  mov    %eax,-0x38(%rbp)
L88:
  subl   $0x1,-0x38(%rbp)
  cmpl   $0xffffffff,-0x38(%rbp)
  je     L93
  mov    -0x38(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L34
  jmp    L88
L93:
  nop
  jmp    L11
L34:
  nop
L11:
  mov    -0x80(%rbp),%rax
  sub    $0x1,%eax
  cmp    %eax,-0x38(%rbp)
  jge    L130
  movl   $0x0,-0x34(%rbp)
  jmp    L103
L63:
  mov    -0x34(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x34(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x70(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x34(%rbp)
L103:
  mov    -0x34(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jle    L63
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  jmp    L101
L130:
  mov    -0x80(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x38(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <divide@plt>
  mov    %al,-0x41(%rbp)
  mov    -0x38(%rbp),%eax
  cltq
  sub    -0x80(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x41(%rbp),%eax
  mov    %al,(%rdx)
  jmp    L75
L101:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void divide_polynomial(unsigned char *dividend, unsigned char *divisor, unsigned char *quotient, unsigned char *remainder, size_t dividend_len, size_t divisor_len) {
  if (divisor_len > dividend_len) {
    for (int i = 0; i < dividend_len; i++) {
      remainder[i] = dividend[i];
    }
    return;
  }
  unsigned char *quotient_divisor_product = malloc(dividend_len);
  if (!quotient_divisor_product)
    abort();
  unsigned char *product_dividend_difference = malloc(dividend_len);
  if (!product_dividend_difference)
    abort();
  unsigned char *divisor_conv = malloc(dividend_len * (dividend_len + divisor_len - 1));
  if (!divisor_conv)
    abort();
  size_t quotient_len = dividend_len - (divisor_len - 1);
  memset(quotient, 0, quotient_len);
  gen_conv_matrix(divisor, divisor_conv, divisor_len - 1, dividend_len - 1);
  for (;;) {
    inner_product_set(quotient_divisor_product, divisor_conv, quotient, quotient_len, dividend_len);
    for (int i = 0; i < dividend_len; i++) {
      product_dividend_difference[i] = sum(dividend[i], quotient_divisor_product[i]);
    }
    int diff_greatest_nonzero = dividend_len;
    for (;;) {
      diff_greatest_nonzero--;
      if (diff_greatest_nonzero == -1)
        break;
      if (product_dividend_difference[diff_greatest_nonzero])
        break;
    }
    if (diff_greatest_nonzero < (int)divisor_len - 1) {
      for (int i = 0; i <= diff_greatest_nonzero; i++) {
        remainder[i] = product_dividend_difference[i];
      }
      free(quotient_divisor_product);
      free(product_dividend_difference);
      free(divisor_conv);
      return;
    }
    unsigned char factor = divide(product_dividend_difference[diff_greatest_nonzero], divisor[divisor_len - 1]);
    quotient[diff_greatest_nonzero - (divisor_len - 1)] = factor;
  }
}
```