user: 下面的汇编指令对应的C源代码是什么:

```asm
<pinValidationData>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x38(%rbp),%rax
  mov    $0x11,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x40(%rbp),%rax
  mov    $0x65,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x15(%rbp),%rax
  mov    $0xd,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x1b(%rbp),%rax
  mov    $0x6,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x40(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <validatePan@plt>
  mov    %eax,-0x20(%rbp)
  cmpl   $0xffffffff,-0x20(%rbp)
  jne    L10
  mov    $0xffffffff,%eax
  jmp    L22
L10:
  cmpl   $0x0,-0x2c(%rbp)
  jle    L2
  cmpl   $0xc,-0x2c(%rbp)
  jle    L48
L2:
  mov    -0x40(%rbp),%rax
  movabs $0x2064696c61766e49,%rsi
  movabs $0x6e6f697469736f70,%rdi
  mov    %rsi,(%rax)
  mov    %rdi,0x8(%rax)
  movabs $0x65736e69206f7420,%rsi
  movabs $0x207473616c207472,%rdi
  mov    %rsi,0x10(%rax)
  mov    %rdi,0x18(%rax)
  movabs $0x7374696769642035,%rsi
  movabs $0x6f63636120666f20,%rdi
  mov    %rsi,0x20(%rax)
  mov    %rdi,0x28(%rax)
  movabs $0x626d756e20746e75,%rsi
  movabs $0x73756d202d207265,%rdi
  mov    %rsi,0x30(%rax)
  mov    %rdi,0x38(%rax)
  movabs $0x7465622065622074,%rsi
  movabs $0x742031206e656577,%rdi
  mov    %rsi,0x40(%rax)
  mov    %rdi,0x48(%rax)
  movabs $0x2121203231206f,%rcx
  mov    %rcx,0x50(%rax)
  mov    $0xffffffff,%eax
  jmp    L22
L48:
  mov    -0x20(%rbp),%eax
  cltq
  lea    -0xd(%rax),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  lea    -0x15(%rbp),%rax
  mov    $0xc,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x9(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    -0x6(%rax),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  lea    -0x1b(%rbp),%rax
  mov    $0x5,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x16(%rbp)
  mov    -0x2c(%rbp),%eax
  sub    $0x1,%eax
  movslq %eax,%rdx
  lea    -0x15(%rbp),%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  lea    -0x1b(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    $0xc,%eax
  sub    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x2c(%rbp),%eax
  cltq
  lea    -0x15(%rbp),%rcx
  add    %rax,%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncat@plt>
  mov    -0x38(%rbp),%rax
  add    $0x11,%rax
  movb   $0x0,(%rax)
  mov    $0x0,%eax
L22:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L41
  call   <__stack_chk_fail@plt>
L41:
  leave
  ret
```

assistant: ```c
int pinValidationData(unsigned const char *ipan, const int iposition, unsigned char *opinvaldat, char *errstatus) {
  memset(opinvaldat, '\0', 8 * 2 + 1);
  memset(errstatus, '\0', 100 + 1);
  unsigned char accountnumber[13];
  memset(accountnumber, '\0', 13);
  unsigned char last5digits[6];
  memset(last5digits, '\0', 6);
  int panlength = validatePan(ipan, errstatus);
  if (panlength == -1)
    return -1;
  if (iposition - 1 < 0 || iposition - 1 > 11) {
    strcpy(errstatus, "Invalid position to insert last 5 digits of account number - must be between 1 to 12 !!");
    return -1;
  }
  strncpy((char *)accountnumber, (const char *)(ipan + panlength - 12 - 1), 12);
  accountnumber[12] = '\0';
  strncpy((char *)last5digits, (const char *)(ipan + panlength - 5 - 1), 5);
  last5digits[5] = '\0';
  strncpy((char *)opinvaldat, (const char *)accountnumber, iposition - 1);
  strcat((char *)opinvaldat, (const char *)last5digits);
  strncat((char *)opinvaldat, (const char *)(accountnumber + iposition), 12 - iposition);
  opinvaldat[8 * 2 + 1] = '\0';
  return 0;
}
```