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

```asm
<FullElement>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %ecx,0x24(%rsp)
  mov    %r8d,0x28(%rsp)
  mov    0x70(%rsp),%eax
  mov    %eax,0x2c(%rsp)
  mov    %eax,%r10d
  mov    0x78(%rsp),%rax
  movl   $0x0,(%rax)
  mov    0x80(%rsp),%rax
  movl   $0x0,(%rax)
  mov    0x88(%rsp),%rax
  movl   $0x0,(%rax)
  mov    0x90(%rsp),%rax
  movl   $0x0,(%rax)
  mov    $0x0,%eax
  cmp    %ecx,%r9d
  jge    L459
  mov    %rdi,%r11
  mov    %rsi,%r15
  mov    %rdx,%r13
  mov    %r8d,%edi
  lea    -0x1(%r9),%ebx
  mov    %ecx,%r14d
  cmp    $0x1,%ecx
  jle    L10
  lea    -0x2(%rcx),%eax
  add    $0x2,%rax
  mov    %rax,0x10(%rsp)
  mov    $0x1,%eax
  movl   $0xffffffff,0xc(%rsp)
  mov    $0x0,%esi
  mov    $0x0,%ecx
  mov    $0x0,%edx
  lea    -0x1(%r14),%r8d
  mov    %r8d,0x20(%rsp)
  mov    %r10b,0x1f(%rsp)
  jmp    L130
L44:
  cmp    %dil,(%r11)
  je     L163
  movzbl (%r11,%rax,1),%r9d
  cmp    %dil,(%r15,%rax,1)
  jne    L351
  jmp    L293
L163:
  cmp    %dil,(%r15)
  je     L415
L152:
  movzbl (%r11,%rax,1),%r9d
L293:
  cmp    %r8d,0x20(%rsp)
  je     L67
  cmp    %r9b,%dil
  sete   %r8b
  movzbl %r8b,%r8d
  add    %r8d,%edx
  cmp    %dil,(%r15,%rax,1)
  sete   %r8b
  movzbl %r8b,%r8d
  add    %r8d,%ecx
  cmp    %dil,0x0(%r13,%rax,1)
  sete   %r8b
  movzbl %r8b,%r8d
  add    %r8d,%esi
  cmpl   $0xffffffff,0xc(%rsp)
  jne    L166
  cmp    $0x1,%edx
  sete   %r9b
  cmp    $0x1,%ecx
  sete   %r8b
  or     %r9b,%r8b
  jne    L387
  cmp    $0x1,%esi
  jne    L166
L387:
  mov    %ebp,0xc(%rsp)
  jmp    L166
L415:
  cmp    %dil,0x0(%r13)
  jne    L152
  jmp    L67
L158:
  mov    %edi,%r9d
L403:
  test   %r8d,%r8d
  jle    L293
  cmp    %r9b,-0x1(%r11,%rax,1)
  je     L183
L67:
  cmp    %ecx,%ebx
  setle  %r12b
  cmp    %ecx,%edx
  mov    %ecx,%r9d
  cmovle %edx,%r9d
  cmp    %esi,%ebx
  setg   %bpl
  cmp    %r9d,%ebx
  jg     L523
  test   %bpl,%bpl
  jne    L453
L523:
  cmp    %esi,%ebx
  setle  %r14b
  cmp    %edx,%ebx
  setg   0x1e(%rsp)
  movzbl 0x1e(%rsp),%r10d
  test   %r12b,%r10b
  je     L431
  test   %r14b,%r14b
  jne    L199
L431:
  cmp    %ecx,%ebx
  setg   %r12b
  test   %bpl,%r12b
  je     L389
  cmp    %edx,%ebx
  jle    L393
L389:
  cmp    %ecx,%edx
  mov    %ecx,%ebp
  cmovge %edx,%ebp
  cmp    %ebp,%ebx
  jle    L514
  test   %r14b,%r14b
  je     L514
  mov    0x90(%rsp),%r10
  addl   $0x1,(%r10)
  jmp    L514
L183:
  movzbl -0x1(%r15,%rax,1),%r10d
  cmp    %r10b,(%r15,%rax,1)
  jne    L67
  movzbl -0x1(%r13,%rax,1),%r10d
  cmp    %r10b,0x0(%r13,%rax,1)
  jne    L67
  jmp    L293
L453:
  mov    0x78(%rsp),%r14
  addl   $0x1,(%r14)
L514:
  cmp    %edx,%ebx
  jg     L142
L531:
  cmp    %esi,%ecx
  mov    %esi,%ebp
  cmovle %ecx,%ebp
  cmp    %ebp,%ebx
  jg     L360
L142:
  cmp    %ecx,%ebx
  jle    L271
L107:
  cmp    %r9d,%ebx
  jle    L201
  cmp    %esi,%ebx
  jle    L266
L201:
  movl   $0xffffffff,0xc(%rsp)
  mov    $0x0,%esi
  mov    $0x0,%ecx
  mov    $0x0,%edx
L166:
  add    $0x1,%rax
  cmp    0x10(%rsp),%rax
  je     L10
L130:
  mov    %eax,0x18(%rsp)
  mov    %eax,%ebp
  mov    %eax,%r8d
  test   %eax,%eax
  je     L44
  movzbl (%r11,%rax,1),%r9d
  cmp    %dil,%r9b
  je     L158
  cmp    %dil,(%r15,%rax,1)
  je     L403
L351:
  cmp    %dil,0x0(%r13,%rax,1)
  jne    L67
  jmp    L403
L199:
  mov    0x80(%rsp),%rcx
  addl   $0x1,(%rcx)
L271:
  cmp    %esi,%edx
  cmovg  %esi,%edx
  cmp    %edx,%ebx
  jle    L107
  mov    0xc(%rsp),%r14d
  lea    -0x1(%r14),%edx
  cmp    %r8d,%edx
  jge    L373
  movslq %edx,%rcx
  add    %r15,%rcx
  movslq %r14d,%rbp
  add    %r15,%rbp
  mov    0x18(%rsp),%r12d
  sub    %r14d,%r12d
  add    %r12,%rbp
  movzbl 0x1f(%rsp),%r10d
L525:
  mov    %r10b,(%rcx)
  add    $0x1,%rcx
  cmp    %rbp,%rcx
  jne    L525
  mov    %r10b,0x1f(%rsp)
  cmp    %r9d,%ebx
  jle    L208
  cmp    %esi,%ebx
  jle    L32
L208:
  movl   $0xffffffff,0xc(%rsp)
  mov    $0x0,%esi
  mov    $0x0,%ecx
  mov    $0x0,%edx
  jmp    L166
L393:
  mov    0x88(%rsp),%r10
  addl   $0x1,(%r10)
  jmp    L531
L360:
  mov    0xc(%rsp),%r14d
  lea    -0x1(%r14),%ebp
  cmp    %r8d,%ebp
  jge    L142
  movslq %ebp,%rbp
  add    %r11,%rbp
  movslq %r14d,%r12
  add    %r11,%r12
  mov    0x18(%rsp),%r10d
  sub    %r14d,%r10d
  add    %r10,%r12
  movzbl 0x1f(%rsp),%r10d
L86:
  mov    %r10b,0x0(%rbp)
  add    $0x1,%rbp
  cmp    %r12,%rbp
  jne    L86
  mov    %r10b,0x1f(%rsp)
  jmp    L142
L266:
  mov    0xc(%rsp),%edx
  sub    $0x1,%edx
  cmp    %r8d,%edx
  jge    L500
L32:
  movslq %edx,%rdx
  movzbl 0x1f(%rsp),%r10d
L116:
  mov    %r10b,0x0(%r13,%rdx,1)
  add    $0x1,%rdx
  cmp    %edx,%r8d
  jg     L116
  mov    %r10b,0x1f(%rsp)
  movl   $0xffffffff,0xc(%rsp)
  mov    $0x0,%esi
  mov    $0x0,%ecx
  mov    $0x0,%edx
  jmp    L166
L373:
  movl   $0xffffffff,0xc(%rsp)
  mov    $0x0,%esi
  mov    $0x0,%ecx
  mov    $0x0,%edx
  jmp    L166
L500:
  movl   $0xffffffff,0xc(%rsp)
  mov    $0x0,%esi
  mov    $0x0,%ecx
  mov    $0x0,%edx
  jmp    L166
L10:
  movsbl 0x2c(%rsp),%r12d
  movsbl 0x28(%rsp),%ebp
  mov    %ebx,%r8d
  mov    %r12d,%ecx
  mov    %ebp,%edx
  mov    0x24(%rsp),%r14d
  mov    %r14d,%esi
  mov    %r11,%rdi
  call   <CorrectAsn@plt>
  mov    %ebx,%r8d
  mov    %r12d,%ecx
  mov    %ebp,%edx
  mov    %r14d,%esi
  mov    %r15,%rdi
  call   <CorrectAsn@plt>
  mov    %ebx,%r8d
  mov    %r12d,%ecx
  mov    %ebp,%edx
  mov    %r14d,%esi
  mov    %r13,%rdi
  call   <CorrectAsn@plt>
  mov    0x78(%rsp),%rax
  mov    (%rax),%eax
  mov    0x80(%rsp),%rdi
  imul   (%rdi),%eax
  mov    0x88(%rsp),%rdi
  imul   (%rdi),%eax
  mov    0x90(%rsp),%rdi
  imul   (%rdi),%eax
L459:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int FullElement(char *Asn1, char *Asn2, char *Asn3, int Length, char SecStrType, int ElemLength, char EditChar, int *YYN, int *NYY, int *YNN, int *NNY) {
  register int i, j, Count1, Count2, Count3;
  int Beg, ElLength;
  *YYN = 0;
  *NYY = 0;
  *YNN = 0;
  *NNY = 0;
  if (ElemLength >= Length)
    return (0);
  ElLength = ElemLength - 1;
  Count1 = 0;
  Count2 = 0;
  Count3 = 0;
  Beg = -1;
  for (i = 1; i < Length; i++) {
    if ((i == 0 && (Asn1[i] == SecStrType && Asn2[i] == SecStrType && Asn3[i] == SecStrType) || (Asn1[i] != SecStrType && Asn2[i] != SecStrType && Asn3[i] != SecStrType)) || (i > 0 && (Asn1[i] != Asn1[i - 1] || Asn2[i] != Asn2[i - 1] || Asn3[i] != Asn3[i - 1])) || i == Length - 1) {
      if (Count1 >= ElLength && Count2 >= ElLength && Count3 < ElLength)
        (*YYN)++;
      else if (Count1 < ElLength && Count2 >= ElLength && Count3 >= ElLength)
        (*NYY)++;
      else if (Count1 >= ElLength && Count2 < ElLength && Count3 < ElLength)
        (*YNN)++;
      else if (Count1 < ElLength && Count2 < ElLength && Count3 >= ElLength)
        (*NNY)++;
      if (Count1 >= ElLength && (Count2 < ElLength || Count3 < ElLength))
        for (j = Beg - 1; j < i; j++)
          Asn1[j] = EditChar;
      if (Count2 >= ElLength && (Count1 < ElLength || Count3 < ElLength))
        for (j = Beg - 1; j < i; j++)
          Asn2[j] = EditChar;
      if (Count3 >= ElLength && (Count1 < ElLength || Count2 < ElLength))
        for (j = Beg - 1; j < i; j++)
          Asn3[j] = EditChar;
      Count1 = 0;
      Count2 = 0;
      Count3 = 0;
      Beg = -1;
    } else {
      if (Asn1[i] == SecStrType)
        Count1++;
      if (Asn2[i] == SecStrType)
        Count2++;
      if (Asn3[i] == SecStrType)
        Count3++;
      if (Beg == -1 && (Count1 == 1 || Count2 == 1 || Count3 == 1))
        Beg = i;
    }
  }
  CorrectAsn(Asn1, Length, SecStrType, EditChar, ElLength);
  CorrectAsn(Asn2, Length, SecStrType, EditChar, ElLength);
  CorrectAsn(Asn3, Length, SecStrType, EditChar, ElLength);
  return ((*YYN) * (*NYY) * (*YNN) * (*NNY));
}
```