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

```asm
<main>:
  endbr64
  push   %r15
  lea    D112(%rip),%rdi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    D122(%rip),%rbx
  sub    $0x2d8,%rsp
  movdqa D153(%rip),%xmm0
  movdqa D76(%rip),%xmm2
  mov    %fs:0x28,%rax
  mov    %rax,0x2c8(%rsp)
  xor    %eax,%eax
  movdqa D149(%rip),%xmm1
  lea    0x100(%rsp),%rbp
  lea    0x140(%rsp),%r12
  movaps %xmm0,0x200(%rsp)
  movdqa D73(%rip),%xmm0
  movaps %xmm2,0x210(%rsp)
  movaps %xmm0,0x230(%rsp)
  movaps %xmm0,0x260(%rsp)
  movaps %xmm0,0x270(%rsp)
  movaps %xmm0,0x280(%rsp)
  movdqa D102(%rip),%xmm0
  movaps %xmm1,0x220(%rsp)
  movaps %xmm0,0x290(%rsp)
  movdqa D85(%rip),%xmm0
  movaps %xmm2,0x240(%rsp)
  movaps %xmm0,0x2a0(%rsp)
  movaps %xmm0,0x2b0(%rsp)
  movdqa D198(%rip),%xmm0
  movaps %xmm1,0x250(%rsp)
  movaps %xmm0,0xc0(%rsp)
  movdqa D101(%rip),%xmm0
  movaps %xmm0,0xd0(%rsp)
  movdqa D177(%rip),%xmm0
  movaps %xmm0,0xe0(%rsp)
  movdqa D185(%rip),%xmm0
  movaps %xmm0,0xf0(%rsp)
  call   <printf@plt>
  mov    %rbp,0x88(%rsp)
  mov    %r12,0x78(%rsp)
  nopl   0x0(%rax,%rax,1)
L57:
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  add    $0x4,%rbp
  call   <scanf@plt>
  cmp    %rbp,%r12
  jne    L57
  lea    D118(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x9c(%rsp),%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x9c(%rsp),%eax
  test   %eax,%eax
  jle    L151
  lea    0x200(%rsp),%rax
  movl   $0x0,0x70(%rsp)
  lea    0x180(%rsp),%r13
  mov    %rax,0x20(%rsp)
  lea    0xa0(%rsp),%rax
  lea    0x1c0(%rsp),%r12
  mov    %rax,0x80(%rsp)
  lea    0xb0(%rsp),%rax
  mov    %rax,0x28(%rsp)
  lea    0xc0(%rsp),%rax
  mov    %rax,0x8(%rsp)
L78:
  mov    0x70(%rsp),%esi
  lea    D61(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x20(%rsp),%rax
  movdqa 0x130(%rsp),%xmm0
  lea    D213(%rip),%rdi
  movdqa 0x110(%rsp),%xmm2
  movdqa 0x120(%rsp),%xmm1
  movdqa 0x30(%rax),%xmm3
  movdqa (%rax),%xmm4
  pxor   0x10(%rax),%xmm2
  pxor   0x20(%rax),%xmm1
  xor    %eax,%eax
  pxor   %xmm3,%xmm0
  movaps %xmm4,0x10(%rsp)
  movdqa 0x100(%rsp),%xmm3
  movaps %xmm2,0x150(%rsp)
  pxor   %xmm4,%xmm3
  movaps %xmm1,0x160(%rsp)
  movaps %xmm3,0x140(%rsp)
  movaps %xmm0,0x170(%rsp)
  call   <printf@plt>
  mov    0x78(%rsp),%rbp
  mov    %rbp,%r14
  nopl   0x0(%rax)
L139:
  mov    0x0(%rbp),%esi
  mov    %rbx,%rdi
  xor    %eax,%eax
  add    $0x4,%rbp
  call   <printf@plt>
  cmp    %rbp,%r13
  jne    L139
  mov    %r12,0x10(%rsp)
  xor    %r15d,%r15d
  mov    %r13,0x30(%rsp)
L25:
  mov    %r15d,%ecx
  xor    %r12d,%r12d
  sar    $0x2,%ecx
  movslq %ecx,%r13
  movl   $0x0,0xa0(%rsp,%r13,4)
L135:
  mov    $0x3,%esi
  mov    (%r14,%r12,4),%ebp
  mov    $0x2,%edi
  sub    %r12d,%esi
  add    $0x1,%r12
  call   <pow@plt>
  imul   %eax,%ebp
  add    %ebp,0xa0(%rsp,%r13,4)
  cmp    $0x4,%r12
  jne    L135
  add    $0x4,%r15d
  add    $0x10,%r14
  cmp    $0x10,%r15d
  jne    L25
  lea    D164(%rip),%rdi
  xor    %eax,%eax
  mov    0x10(%rsp),%r12
  mov    0x30(%rsp),%r13
  call   <printf@plt>
  mov    0x80(%rsp),%rbp
  mov    0x28(%rsp),%r14
L70:
  mov    0x0(%rbp),%esi
  lea    D96(%rip),%rdi
  xor    %eax,%eax
  add    $0x4,%rbp
  call   <printf@plt>
  cmp    %rbp,%r14
  jne    L70
  movslq 0xa0(%rsp),%rax
  lea    D202(%rip),%rdi
  mov    0xc0(%rsp,%rax,4),%edx
  movslq 0xa4(%rsp),%rax
  mov    0xc0(%rsp,%rax,4),%r14d
  movd   %edx,%xmm0
  mov    %edx,0x10(%rsp)
  movslq 0xa8(%rsp),%rax
  movd   %r14d,%xmm6
  mov    0xc0(%rsp,%rax,4),%ebp
  movslq 0xac(%rsp),%rax
  punpckldq %xmm6,%xmm0
  mov    0xc0(%rsp,%rax,4),%eax
  movd   %ebp,%xmm1
  movd   %eax,%xmm5
  mov    %eax,0x30(%rsp)
  xor    %eax,%eax
  punpckldq %xmm5,%xmm1
  punpcklqdq %xmm1,%xmm0
  movaps %xmm0,0xb0(%rsp)
  call   <printf@plt>
  mov    0x28(%rsp),%r15
L118:
  mov    (%r15),%esi
  lea    D96(%rip),%rdi
  xor    %eax,%eax
  add    $0x4,%r15
  call   <printf@plt>
  cmp    0x8(%rsp),%r15
  jne    L118
  mov    0x10(%rsp),%edx
  mov    0x30(%rsp),%r15d
  mov    %ebp,%r9d
  mov    %r14d,%edi
  shr    $0x2,%r9d
  mov    %r14d,%r8d
  mov    %r14d,%ecx
  and    $0x1,%r14d
  mov    %edx,%eax
  mov    %edx,%esi
  mov    %r15d,%r10d
  and    $0x1,%r9d
  shr    $0x2,%eax
  movd   %r14d,%xmm1
  movd   %r9d,%xmm7
  shr    $0x3,%edi
  and    $0x1,%eax
  and    $0x1,%edi
  shr    %ecx
  mov    %r9d,0x1e4(%rsp)
  mov    %eax,0x60(%rsp)
  shr    $0x3,%r10d
  shr    $0x2,%r8d
  and    $0x1,%ecx
  mov    %eax,0x1c4(%rsp)
  mov    %edx,%eax
  and    $0x1,%edx
  and    $0x1,%r10d
  mov    %edx,%r11d
  mov    %edx,0x1cc(%rsp)
  shr    %eax
  mov    %ebp,%edx
  and    $0x1,%eax
  shr    $0x3,%edx
  movd   %r10d,%xmm2
  and    $0x1,%r8d
  mov    %eax,0x10(%rsp)
  punpckldq %xmm2,%xmm1
  movd   %r8d,%xmm3
  shr    $0x3,%esi
  mov    %eax,0x1c8(%rsp)
  mov    %edx,%eax
  movdqa %xmm1,%xmm4
  mov    %ebp,%edx
  and    $0x1,%eax
  and    $0x1,%ebp
  shr    %edx
  movd   0x60(%rsp),%xmm2
  movd   %eax,%xmm0
  movd   %ebp,%xmm1
  and    $0x1,%edx
  and    $0x1,%esi
  punpckldq %xmm7,%xmm0
  punpckldq %xmm3,%xmm1
  movd   %edx,%xmm6
  mov    %esi,0x74(%rsp)
  mov    %eax,0x1e0(%rsp)
  mov    %r15d,%eax
  punpcklqdq %xmm0,%xmm4
  movd   %esi,%xmm7
  shr    $0x2,%eax
  movaps %xmm4,0x40(%rsp)
  movd   %edi,%xmm4
  and    $0x1,%eax
  mov    %edi,0x1d0(%rsp)
  lea    D44(%rip),%rdi
  mov    %eax,0x1f4(%rsp)
  movd   %eax,%xmm0
  mov    %r15d,%eax
  and    $0x1,%r15d
  punpckldq %xmm4,%xmm0
  shr    %eax
  mov    %esi,0x1c0(%rsp)
  and    $0x1,%eax
  movdqa %xmm0,%xmm5
  mov    %r8d,0x1d4(%rsp)
  punpcklqdq %xmm1,%xmm5
  movd   %eax,%xmm0
  movd   %r11d,%xmm1
  mov    %eax,0x1f8(%rsp)
  movaps %xmm5,0x50(%rsp)
  punpckldq %xmm6,%xmm0
  movd   %ecx,%xmm5
  xor    %eax,%eax
  punpckldq %xmm5,%xmm1
  movdqa %xmm0,%xmm6
  movd   %r15d,%xmm0
  mov    %ecx,0x1d8(%rsp)
  punpcklqdq %xmm1,%xmm6
  movd   0x10(%rsp),%xmm1
  punpckldq %xmm7,%xmm0
  mov    %edx,0x1e8(%rsp)
  mov    %ebp,0x1ec(%rsp)
  mov    $0x2,%ebp
  punpckldq %xmm2,%xmm1
  mov    %r10d,0x1f0(%rsp)
  movdqa %xmm1,%xmm7
  movaps %xmm6,0x30(%rsp)
  punpcklqdq %xmm0,%xmm7
  mov    %r14d,0x1dc(%rsp)
  movaps %xmm7,0x60(%rsp)
  mov    %r15d,0x1fc(%rsp)
  call   <printf@plt>
  mov    0x74(%rsp),%esi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopl   0x0(%rax)
L79:
  mov    -0x4(%r12,%rbp,4),%esi
  xor    %eax,%eax
  mov    %rbx,%rdi
  call   <printf@plt>
  test   $0x3,%bpl
  jne    L112
  mov    $0x20,%edi
  call   <putchar@plt>
L112:
  add    $0x1,%rbp
  cmp    $0x11,%rbp
  jne    L79
  movdqa 0x60(%rsp),%xmm3
  movdqa 0x30(%rsp),%xmm4
  xor    %eax,%eax
  lea    D183(%rip),%rdi
  movdqa 0x40(%rsp),%xmm5
  movdqa 0x50(%rsp),%xmm6
  mov    $0x2,%ebp
  movaps %xmm3,0x180(%rsp)
  movaps %xmm4,0x190(%rsp)
  movaps %xmm5,0x1a0(%rsp)
  movaps %xmm6,0x1b0(%rsp)
  call   <printf@plt>
  mov    0x10(%rsp),%esi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopw   0x0(%rax,%rax,1)
L27:
  mov    -0x4(%r13,%rbp,4),%esi
  xor    %eax,%eax
  mov    %rbx,%rdi
  call   <printf@plt>
  test   $0x3,%bpl
  jne    L116
  mov    $0x20,%edi
  call   <putchar@plt>
L116:
  add    $0x1,%rbp
  cmp    $0x11,%rbp
  jne    L27
  addl   $0x1,0x70(%rsp)
  mov    0x70(%rsp),%eax
  addq   $0x40,0x20(%rsp)
  cmp    %eax,0x9c(%rsp)
  jg     L78
L35:
  lea    D31(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x88(%rsp),%rbp
  mov    0x78(%rsp),%r14
  nopl   0x0(%rax,%rax,1)
L136:
  mov    0x0(%rbp),%esi
  mov    %rbx,%rdi
  xor    %eax,%eax
  add    $0x4,%rbp
  call   <printf@plt>
  cmp    %rbp,%r14
  jne    L136
  lea    D45(%rip),%rdi
  xor    %eax,%eax
  mov    %r13,%rbp
  call   <printf@plt>
  nopw   0x0(%rax,%rax,1)
L75:
  mov    0x0(%rbp),%esi
  mov    %rbx,%rdi
  xor    %eax,%eax
  add    $0x4,%rbp
  call   <printf@plt>
  cmp    %rbp,%r12
  jne    L75
  mov    0x2c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L131
  add    $0x2d8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L151:
  lea    0x180(%rsp),%r13
  lea    0x1c0(%rsp),%r12
  jmp    L35
L131:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D112
datatype: string
name: unpack_data
arguments: data_label: D122
datatype: string
name: unpack_data
arguments: data_label: D153
datatype: byte[16]
name: unpack_data
arguments: data_label: D76
datatype: byte[16]
name: unpack_data
arguments: data_label: D149
datatype: byte[16]
name: unpack_data
arguments: data_label: D73
datatype: byte[16]
name: unpack_data
arguments: data_label: D102
datatype: byte[16]
name: unpack_data
arguments: data_label: D85
datatype: byte[16]
name: unpack_data
arguments: data_label: D198
datatype: byte[16]
name: unpack_data
arguments: data_label: D101
datatype: byte[16]
name: unpack_data
arguments: data_label: D177
datatype: byte[16]
name: unpack_data
arguments: data_label: D185
datatype: byte[16]
name: unpack_data
arguments: data_label: D118
datatype: string
name: unpack_data
arguments: data_label: D61
datatype: string
name: unpack_data
arguments: data_label: D213
datatype: string
name: unpack_data
arguments: data_label: D164
datatype: string
name: unpack_data
arguments: data_label: D96
datatype: string
name: unpack_data
arguments: data_label: D202
datatype: string
name: unpack_data
arguments: data_label: D44
datatype: string
name: unpack_data
arguments: data_label: D183
datatype: string
name: unpack_data
arguments: data_label: D31
datatype: string
name: unpack_data
arguments: data_label: D45
datatype: string

tool: D112: Enter plaintext (16 integers) : 

tool: D122: %d

tool: {"D153": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: {"D76": [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D149": [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: {"D73": [0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D102": [0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: {"D85": [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: {"D198": [0x0e,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: {"D101": [0x02,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00]}

tool: {"D177": [0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00]}

tool: {"D185": [0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00]}

tool: D118: 
Enter no. of iterations : 

tool: D61: 
#%d:

tool: D213: 
XOR : 

tool: D164: 
HEX : 

tool: D96: %d 

tool: D202: 
SUBSTITUTED : 

tool: D44: 
CONVERTED : 

tool: D183: 
PERMUTATED : 

tool: D31: 
Plain text : 

tool: D45: 
Ciphertext : 

assistant: ```c
int main() {
  int key[3][16] = {{0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0}, {1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1}};
  int perm[16] = {3, 2, 16, 1, 15, 11, 4, 7, 8, 13, 9, 10, 14, 5, 12, 6};
  int subs[16] = {14, 4, 13, 1, 2, 15, 11, 8, 9, 10, 6, 12, 5, 9, 0, 7};
  int msg[16];
  int i, j, k, n, xored[16], pxored[16], hex[4], subbed[4], l, bin[16];
  printf("Enter plaintext (16 integers) : ");
  for (i = 0; i < 16; i++)
    scanf("%d", &msg[i]);
  printf("\nEnter no. of iterations : ");
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    printf("\n#%d:", i);
    for (j = 0; j < 16; j++) {
      xored[j] = msg[j] ^ key[i][j];
    }
    printf("\nXOR : ");
    for (j = 0; j < 16; j++) {
      printf("%d", xored[j]);
    }
    for (j = 0; j < 16; j = j + 4) {
      hex[j / 4] = 0;
      for (k = 0; k < 4; k++) {
        hex[j / 4] += xored[j + k] * pow(2, (3 - k));
      }
    }
    printf("\nHEX : ");
    for (j = 0; j < 4; j++) {
      printf("%d ", hex[j]);
    }
    for (j = 0; j < 4; j++) {
      subbed[j] = subs[hex[j]];
    }
    printf("\nSUBSTITUTED : ");
    for (j = 0; j < 4; j++) {
      printf("%d ", subbed[j]);
    }
    for (j = 0, k = 0; j < 4; j++) {
      for (l = 1 << 3; l > 0; l = l / 2) {
        if (subbed[j] & l)
          bin[k++] = 1;
        else
          bin[k++] = 0;
      }
    }
    printf("\nCONVERTED : ");
    for (j = 0; j < 16; j++) {
      printf("%d", bin[j]);
      if ((j + 1) % 4 == 0)
        printf(" ");
    }
    for (j = 0; j < 16; j++) {
      pxored[j] = bin[perm[j] - 1];
    }
    printf("\nPERMUTATED : ");
    for (j = 0; j < 16; j++) {
      printf("%d", pxored[j]);
      if ((j + 1) % 4 == 0)
        printf(" ");
    }
  }
  printf("\nPlain text : ");
  for (i = 0; i < 16; i++)
    printf("%d", msg[i]);
  printf("\nCiphertext : ");
  for (i = 0; i < 16; i++)
    printf("%d", pxored[i]);
  return 0;
}
```