user: Translate the below assembly code into C programming language:

```asm
<mc64ud_>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdx,-0x10(%rsp)
  mov    %rcx,%r10
  mov    0x68(%rsp),%rdx
  mov    0x70(%rsp),%rbx
  mov    0x78(%rsp),%rcx
  sub    $0x4,%rcx
  mov    %rcx,-0x50(%rsp)
  lea    -0x4(%rdx),%rcx
  mov    %rcx,-0x30(%rsp)
  mov    0x60(%rsp),%rcx
  sub    $0x4,%rcx
  mov    %rcx,-0x48(%rsp)
  mov    0x48(%rsp),%rcx
  lea    -0x4(%rcx),%r13
  mov    0x38(%rsp),%rcx
  lea    -0x4(%rcx),%r12
  lea    -0x4(%r9),%rcx
  mov    %rcx,-0x40(%rsp)
  mov    (%rdi),%ecx
  cmp    $0x1,%ecx
  je     L121
  mov    (%rsi),%eax
  cmp    $0x1,%eax
  je     L273
L333:
  mov    0x58(%rsp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x18(%rsp)
  mov    -0x10(%rsp),%rsi
  mov    (%rsi),%esi
  mov    %esi,-0x54(%rsp)
  sub    %eax,%esi
  mov    %esi,-0x8(%rsp)
L350:
  mov    0x50(%rsp),%rax
  mov    (%rax),%edx
  mov    %edx,-0x4(%rsp)
  mov    -0x10(%rsp),%rax
  mov    (%rax),%esi
  mov    %esi,-0x1c(%rsp)
  mov    (%rdi),%eax
  sub    $0x1,%eax
  mov    %esi,%edi
  imul   %esi,%eax
  lea    0x1(%rdx),%esi
  mov    %esi,-0x54(%rsp)
  cmp    %esi,%edi
  jl     L290
  mov    0x40(%rsp),%rdi
  mov    %rdi,-0x28(%rsp)
  add    %esi,%eax
  mov    %eax,-0x20(%rsp)
  movl   $0x0,-0x14(%rsp)
  jmp    L262
L121:
  mov    -0x10(%rsp),%rax
  mov    (%rax),%esi
  test   %esi,%esi
  jle    L14
  mov    %esi,%ecx
  mov    $0x0,%eax
L113:
  movl   $0x0,(%rbx,%rax,4)
  movl   $0x0,(%rdx,%rax,4)
  add    $0x1,%rax
  cmp    %rcx,%rax
  jne    L113
  lea    0x1(%rsi),%ecx
L14:
  mov    -0x10(%rsp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x18(%rsp)
  mov    %eax,-0x8(%rsp)
  jmp    L350
L273:
  mov    -0x10(%rsp),%rcx
  mov    (%rcx),%esi
  test   %esi,%esi
  jle    L329
  mov    %rdx,%rax
  mov    %esi,%ecx
  lea    (%rdx,%rcx,4),%rdx
L268:
  movl   $0x0,(%rax)
  add    $0x4,%rax
  cmp    %rdx,%rax
  jne    L268
  lea    0x1(%rsi),%ecx
  jmp    L333
L329:
  mov    %eax,%ecx
  jmp    L333
L196:
  mov    -0x40(%rsp),%rdi
  mov    (%rdi,%rbp,4),%edi
  mov    %edi,-0x34(%rsp)
  lea    (%rax,%rdi,1),%r8d
  lea    (%r14,%rdi,1),%edi
  movslq %r8d,%rax
  lea    (%r10,%rax,4),%rax
L307:
  mov    -0x4(%rax),%ecx
  movslq %ecx,%rdx
  cmpl   $0x0,0x0(%r13,%rdx,4)
  je     L315
  add    $0x1,%r8d
  add    $0x4,%rax
  cmp    %r8d,%edi
  jg     L307
  mov    %r14d,(%r15)
  jmp    L250
L327:
  mov    0x0(%r13,%rdx,1),%eax
  mov    %r11d,(%rsi)
  movslq %eax,%rdx
  mov    -0x48(%rsp),%rsi
  mov    %r9d,(%rsi,%rdx,4)
  sub    %r8d,%edi
  sub    $0x1,%edi
  mov    %edi,(%r15)
  mov    %eax,%r9d
L219:
  addl   $0x1,-0x38(%rsp)
  mov    -0x38(%rsp),%eax
  cmp    -0x54(%rsp),%eax
  jg     L315
L221:
  movslq %r9d,%rbp
  lea    0x0(,%rbp,4),%rsi
  mov    -0x30(%rsp),%rax
  lea    (%rax,%rsi,1),%r15
  mov    (%r15),%eax
  add    %r12,%rsi
  mov    (%rsi),%r14d
  cmp    %r14d,%eax
  jl     L196
L250:
  mov    (%rsi),%eax
  sub    $0x1,%eax
  mov    -0x50(%rsp),%rsi
  mov    %eax,(%rsi,%rbp,4)
  mov    $0x1,%r14d
  jmp    L67
L160:
  mov    -0x48(%rsp),%rax
  mov    (%rax,%rbp,4),%eax
  cmp    $0xffffffff,%eax
  je     L22
  add    $0x1,%r14d
  cmp    -0x54(%rsp),%r14d
  jg     L171
  mov    %eax,%r9d
L67:
  movslq %r9d,%rbp
  mov    -0x50(%rsp),%rax
  lea    (%rax,%rbp,4),%r15
  mov    (%r15),%eax
  test   %eax,%eax
  js     L160
  mov    (%r12,%rbp,4),%edi
  mov    -0x40(%rsp),%rsi
  add    (%rsi,%rbp,4),%edi
  sub    $0x1,%edi
  mov    %edi,%r8d
  sub    %eax,%r8d
  cmp    %r8d,%edi
  jl     L160
  movslq %r8d,%rax
L181:
  mov    %eax,%r8d
  mov    -0x4(%r10,%rax,4),%ecx
  movslq %ecx,%rdx
  shl    $0x2,%rdx
  lea    -0x4(%rbx,%rdx,1),%rsi
  cmp    %r11d,(%rsi)
  jne    L327
  lea    0x1(%rax),%r8d
  add    $0x1,%rax
  cmp    %eax,%edi
  jge    L181
  jmp    L160
L22:
  addl   $0x1,-0x14(%rsp)
  mov    -0x14(%rsp),%esi
  movslq %esi,%rax
  mov    0x40(%rsp),%rdi
  mov    %r9d,-0x4(%rdi,%rax,4)
  cmp    %esi,-0x8(%rsp)
  jge    L318
  jmp    L328
L171:
  mov    %eax,%r9d
  jmp    L219
L315:
  movslq %ecx,%rax
  mov    %r9d,0x0(%r13,%rax,4)
  movslq %r9d,%rdx
  mov    -0x40(%rsp),%r11
  mov    %r8d,%eax
  sub    (%r11,%rdx,4),%eax
  add    $0x1,%eax
  mov    -0x30(%rsp),%rsi
  mov    %eax,(%rsi,%rdx,4)
  mov    0x50(%rsp),%rax
  addl   $0x1,(%rax)
  mov    -0x54(%rsp),%ebp
  test   %ebp,%ebp
  jle    L203
  mov    $0x1,%eax
  mov    -0x50(%rsp),%rdi
  mov    -0x48(%rsp),%rsi
L106:
  movslq %r9d,%r9
  mov    (%rsi,%r9,4),%r9d
  cmp    $0xffffffff,%r9d
  je     L203
  movslq %r9d,%rdx
  mov    (%r12,%rdx,4),%r8d
  add    (%r11,%rdx,4),%r8d
  sub    (%rdi,%rdx,4),%r8d
  sub    $0x2,%r8d
  movslq %r8d,%rdx
  mov    -0x4(%r10,%rdx,4),%ecx
  movslq %ecx,%rdx
  mov    %r9d,0x0(%r13,%rdx,4)
  add    $0x1,%eax
  cmp    %ebp,%eax
  jle    L106
L203:
  mov    0x50(%rsp),%rax
  mov    -0x18(%rsp),%esi
  cmp    %esi,(%rax)
  je     L328
L318:
  addl   $0x1,-0x54(%rsp)
  mov    -0x54(%rsp),%eax
  addq   $0x4,-0x28(%rsp)
  addl   $0x1,-0x20(%rsp)
  cmp    %eax,-0x1c(%rsp)
  jl     L223
L262:
  mov    -0x20(%rsp),%r11d
  mov    -0x28(%rsp),%rax
  mov    (%rax),%r9d
  movslq %r9d,%rax
  mov    -0x48(%rsp),%rsi
  movl   $0xffffffff,(%rsi,%rax,4)
  cmpl   $0x0,-0x54(%rsp)
  jle    L315
  movl   $0x1,-0x38(%rsp)
  jmp    L221
L290:
  movl   $0x0,-0x14(%rsp)
L223:
  mov    -0x10(%rsp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x54(%rsp)
L328:
  mov    -0x10(%rsp),%rax
  mov    (%rax),%edx
  mov    -0x54(%rsp),%ebx
  lea    0x1(%rbx),%eax
  cmp    %eax,%edx
  jl     L282
  movslq -0x4(%rsp),%rcx
  cltq
  sub    %rcx,%rax
  mov    0x40(%rsp),%rdi
  lea    -0x4(%rdi,%rax,4),%rax
  movslq %ebx,%rdi
  sub    $0x1,%edx
  sub    %ebx,%edx
  mov    %rdi,%rsi
  sub    %rcx,%rsi
  add    %rsi,%rdx
  mov    0x40(%rsp),%rbx
  lea    0x4(%rbx,%rdx,4),%rsi
  movslq -0x14(%rsp),%rdx
  add    %rcx,%rdx
  sub    %rdi,%rdx
L152:
  mov    (%rax),%ecx
  mov    %ecx,(%rax,%rdx,4)
  add    $0x4,%rax
  cmp    %rsi,%rax
  jne    L152
L282:
  mov    $0x0,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int mc64ud_(int *id, int *mod, int *n, int *irn, int *lirn, int *ip, int *lenc, int *fc, int *iperm, int *num, int *numx, int *pr, int *arp, int *cv, int *out) {
  int i__1, i__2, i__3, i__4;
  int i__, j, k, j1, ii, kk, id0, id1, in1, in2, nfc, num0, num1, num2, jord, last;
  --out;
  --cv;
  --arp;
  --pr;
  --iperm;
  --fc;
  --lenc;
  --ip;
  --irn;
  if (*id == 1) {
    i__1 = *n;
    for (i__ = 1; i__ <= i__1; ++i__) {
      cv[i__] = 0;
      arp[i__] = 0;
    }
    num1 = *n;
    num2 = *n;
  } else {
    if (*mod == 1) {
      i__1 = *n;
      for (i__ = 1; i__ <= i__1; ++i__) {
        arp[i__] = 0;
      }
    }
    num1 = *numx;
    num2 = *n - *numx;
  }
  num0 = *num;
  nfc = 0;
  id0 = (*id - 1) * *n;
  i__1 = *n;
  for (jord = num0 + 1; jord <= i__1; ++jord) {
    id1 = id0 + jord;
    j = fc[jord - num0];
    pr[j] = -1;
    i__2 = jord;
    for (k = 1; k <= i__2; ++k) {
      if (arp[j] >= lenc[j]) {
        goto L30;
      }
      in1 = ip[j] + arp[j];
      in2 = ip[j] + lenc[j] - 1;
      i__3 = in2;
      for (ii = in1; ii <= i__3; ++ii) {
        i__ = irn[ii];
        if (iperm[i__] == 0) {
          goto L80;
        }
      }
      arp[j] = lenc[j];
    L30:
      out[j] = lenc[j] - 1;
      i__3 = jord;
      for (kk = 1; kk <= i__3; ++kk) {
        in1 = out[j];
        if (in1 < 0) {
          goto L50;
        }
        in2 = ip[j] + lenc[j] - 1;
        in1 = in2 - in1;
        i__4 = in2;
        for (ii = in1; ii <= i__4; ++ii) {
          i__ = irn[ii];
          if (cv[i__] == id1) {
            goto L40;
          }
          j1 = j;
          j = iperm[i__];
          cv[i__] = id1;
          pr[j] = j1;
          out[j1] = in2 - ii - 1;
          goto L70;
        L40:;
        }
      L50:
        j1 = pr[j];
        if (j1 == -1) {
          ++nfc;
          fc[nfc] = j;
          if (nfc > num2) {
            last = jord;
            goto L101;
          }
          goto L100;
        }
        j = j1;
      }
    L70:;
    }
  L80:
    iperm[i__] = j;
    arp[j] = ii - ip[j] + 1;
    ++(*num);
    i__2 = jord;
    for (k = 1; k <= i__2; ++k) {
      j = pr[j];
      if (j == -1) {
        goto L95;
      }
      ii = ip[j] + lenc[j] - out[j] - 2;
      i__ = irn[ii];
      iperm[i__] = j;
    }
  L95:
    if (*num == num1) {
      last = jord;
      goto L101;
    }
  L100:;
  }
  last = *n;
L101:
  i__1 = *n;
  for (jord = last + 1; jord <= i__1; ++jord) {
    ++nfc;
    fc[nfc] = fc[jord - num0];
  }
  return 0;
}
```