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

```asm
<encrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  mov    %rsi,%rdi
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdx,-0x58(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x38(%rbp)
  xor    %eax,%eax
  mov    %rsi,-0x48(%rbp)
  call   <strlen@plt>
  mov    %r12,%rdi
  mov    %rax,%rbx
  call   <strlen@plt>
  xor    %edx,%edx
  mov    -0x48(%rbp),%rcx
  lea    (%rbx,%rax,1),%rdi
  mov    %rax,%r14
  mov    %rax,%rsi
  div    %rbx
  sub    %rdx,%rdi
  lea    0xf(%rdi),%rax
  mov    %rsp,%rdi
  mov    %rax,%rdx
  and    $0xfffffffffffff000,%rax
  sub    %rax,%rdi
  and    $0xfffffffffffffff0,%rdx
  cmp    %rdi,%rsp
  je     L155
L105:
  sub    $0x1000,%rsp
  orq    $0x0,0xff8(%rsp)
  cmp    %rdi,%rsp
  jne    L105
L155:
  and    $0xfff,%edx
  sub    %rdx,%rsp
  test   %rdx,%rdx
  jne    L86
L125:
  mov    %rsp,-0x50(%rbp)
  test   %r14,%r14
  je     L93
  add    %r12,%r14
  xor    %r13d,%r13d
  xchg   %ax,%ax
L65:
  movsbl (%r12),%edi
  cmp    $0x20,%dil
  je     L100
  mov    %rcx,-0x48(%rbp)
  lea    0x1(%r13),%r15
  call   <toupper@plt>
  mov    -0x50(%rbp),%rcx
  mov    %al,(%rcx,%r13,1)
  mov    -0x48(%rbp),%rcx
  mov    %r15,%r13
L100:
  add    $0x1,%r12
  cmp    %r12,%r14
  jne    L65
  mov    %r13,%rax
  xor    %edx,%edx
  div    %rbx
  test   %rdx,%rdx
  je     L80
  mov    -0x50(%rbp),%rsi
  xor    %edi,%edi
  lea    0x1(%r13),%r10
  lea    (%rsi,%r13,1),%r9
  cmp    %rbx,%rdx
  je     L80
  nopl   0x0(%rax,%rax,1)
L122:
  lea    (%r10,%rdi,1),%rsi
  xor    %edx,%edx
  mov    %rbx,%r8
  movb   $0x51,(%r9,%rdi,1)
  mov    %rsi,%rax
  add    $0x1,%rdi
  div    %rbx
  sub    %rdx,%r8
  cmp    %rdi,%r8
  ja     L122
L106:
  mov    -0x50(%rbp),%rdi
  movb   $0x0,(%rdi,%rsi,1)
  cmp    %rbx,%rsi
  jb     L134
  mov    -0x58(%rbp),%r13
  mov    %rdi,%r12
  xor    %r8d,%r8d
  nopw   0x0(%rax,%rax,1)
L87:
  xor    %edi,%edi
  test   %rbx,%rbx
  je     L161
  nopw   0x0(%rax,%rax,1)
L145:
  movsbl (%rcx,%rdi,1),%edx
  movsbl (%r12,%rdi,1),%esi
  lea    -0x82(%rsi,%rdx,1),%esi
  movslq %esi,%rdx
  mov    %esi,%r9d
  imul   $0x4ec4ec4f,%rdx,%rdx
  sar    $0x1f,%r9d
  sar    $0x23,%rdx
  sub    %r9d,%edx
  imul   $0x1a,%edx,%edx
  sub    %edx,%esi
  add    $0x41,%esi
  mov    %sil,0x0(%r13,%rdi,1)
  add    $0x1,%rdi
  cmp    %rdi,%rbx
  jne    L145
L161:
  add    $0x1,%r8
  add    %rbx,%r12
  add    %rbx,%r13
  cmp    %rax,%r8
  jb     L87
L134:
  mov    -0x38(%rbp),%rax
  sub    %fs:0x28,%rax
  jne    L160
  lea    -0x28(%rbp),%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
L80:
  mov    %r13,%rsi
  jmp    L106
L86:
  orq    $0x0,-0x8(%rsp,%rdx,1)
  jmp    L125
L93:
  xor    %eax,%eax
  jmp    L106
L160:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void encrypt(const char *p, const char *key, char *c) {
  size_t klen = strlen(key);
  size_t plen = strlen(p);
  size_t pplen = strlen(p) + (strlen(key) - strlen(p) % strlen(key));
  char pp[pplen];
  pplen = 0;
  for (size_t i = 0; i < plen; i++) {
    if (p[i] == ' ')
      continue;
    pp[pplen++] = toupper(p[i]);
  }
  if (pplen % klen != 0)
    for (size_t i = 0; i < klen - (pplen % klen); i++)
      pp[pplen++] = 'Q';
  pp[pplen] = '\0';
  for (size_t i = 0; i < pplen / klen; i++)
    for (size_t j = 0; j < klen; j++) {
      c[i * klen + j] = (pp[i * klen + j] - 'A' + (key[j] - 'A')) % 26 + 'A';
    }
}
```