user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<main>:
  endbr64
  push   %r15
  mov    $0x58,%ecx
  pxor   %xmm0,%xmm0
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x6d8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x6c8(%rsp)
  movabs $0x100000000,%rax
  mov    %rsp,%r13
  lea    0x40(%rsp),%rbp
  lea    0x140(%rsp),%rdi
  lea    0x400(%rsp),%r12
  lea    0x140(%rsp),%r14
  lea    0xc0(%rsp),%r15
  mov    %rax,(%rsp)
  movabs $0x300000002,%rax
  mov    %rax,0x8(%rsp)
  movabs $0x500000004,%rax
  mov    %rax,0x10(%rsp)
  movabs $0x700000006,%rax
  mov    %rax,0x18(%rsp)
  movabs $0x900000008,%rax
  mov    %rax,0x20(%rsp)
  movabs $0xb0000000a,%rax
  mov    %rax,0x28(%rsp)
  movabs $0xd0000000c,%rax
  mov    %rax,0x30(%rsp)
  movabs $0xf0000000e,%rax
  mov    %rax,0x38(%rsp)
  movabs $0x1100000000,%rax
  mov    %rax,0x40(%rsp)
  movabs $0x3300000022,%rax
  mov    %rax,0x48(%rsp)
  movabs $0x5500000044,%rax
  mov    %rax,0x50(%rsp)
  movabs $0x7700000066,%rax
  mov    %rax,0x58(%rsp)
  movabs $0x9900000088,%rax
  mov    %rax,0x60(%rsp)
  movabs $0xbb000000aa,%rax
  mov    %rax,0x68(%rsp)
  movabs $0xdd000000cc,%rax
  mov    %rax,0x70(%rsp)
  movabs $0xff000000ee,%rax
  mov    %rax,0x78(%rsp)
  movabs $0xc400000069,%rax
  mov    %rax,0x80(%rsp)
  movabs $0xd8000000e0,%rax
  mov    %rax,0x88(%rsp)
  movabs $0x7b0000006a,%rax
  mov    %rax,0x90(%rsp)
  movabs $0x3000000004,%rax
  mov    %rax,0x98(%rsp)
  movabs $0xcd000000d8,%rax
  mov    %rax,0xa0(%rsp)
  movabs $0x80000000b7,%rax
  mov    %rax,0xa8(%rsp)
  movabs $0xb400000070,%rax
  mov    %rax,0xb0(%rsp)
  movabs $0x5a000000c5,%rax
  mov    %rax,0xb8(%rsp)
  xor    %eax,%eax
  rep stos %rax,%es:(%rdi)
  mov    $0x58,%ecx
  mov    %r12,%rdi
  movaps %xmm0,0xc0(%rsp)
  rep stos %rax,%es:(%rdi)
  movaps %xmm0,0xd0(%rsp)
  movaps %xmm0,0xe0(%rsp)
  movaps %xmm0,0xf0(%rsp)
  movaps %xmm0,0x100(%rsp)
  movaps %xmm0,0x110(%rsp)
  movaps %xmm0,0x120(%rsp)
  movaps %xmm0,0x130(%rsp)
  call   <AES_128_generate_tables@plt>
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <AES_128_key_exp_enc_asm@plt>
  mov    %r14,%rdx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <AES_128_encrypt_asm@plt>
  lea    0x80(%rsp),%r14
  mov    $0x40,%edx
  mov    %r15,%rdi
  mov    %r14,%rsi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L32
  lea    D20(%rip),%rdi
  call   <printf@plt>
L48:
  mov    $0x10,%esi
  mov    %r15,%rdi
  lea    D25(%rip),%rbx
  call   <printx@plt>
  mov    %rbx,%rdi
  lea    D4(%rip),%r15
  call   <printf@plt>
  mov    $0x10,%esi
  mov    %r14,%rdi
  call   <printx@plt>
  mov    %r15,%rdi
  call   <printf@plt>
  mov    %r13,%rdi
  mov    %r12,%rsi
  lea    0x100(%rsp),%r13
  call   <AES_128_key_exp_dec_asm@plt>
  mov    %r12,%rdx
  mov    %r13,%rsi
  mov    %r14,%rdi
  call   <AES_128_decrypt_asm@plt>
  mov    $0x40,%edx
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L47
  lea    D22(%rip),%rdi
  call   <printf@plt>
L23:
  mov    $0x10,%esi
  mov    %r13,%rdi
  call   <printx@plt>
  mov    %rbx,%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  mov    $0x10,%esi
  call   <printx@plt>
  mov    %r15,%rdi
  call   <printf@plt>
  mov    0x6c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L13
  add    $0x6d8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L32:
  lea    D3(%rip),%rdi
  call   <printf@plt>
  jmp    L48
L47:
  lea    D48(%rip),%rdi
  call   <printf@plt>
  jmp    L23
L13:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D20
datatype: string
name: unpack_data
arguments: data_label: D25
datatype: string
name: unpack_data
arguments: data_label: D4
datatype: string
name: unpack_data
arguments: data_label: D22
datatype: string
name: unpack_data
arguments: data_label: D3
datatype: string
name: unpack_data
arguments: data_label: D48
datatype: string

tool: D20: ENCRYPT TEST PASSED: 

tool: D25:  vs. 

tool: D4: 


tool: D22: DECRYPT TEST PASSED: 

tool: D3: ENCRYPT TEST FAILED: 

tool: D48: DECRYPT TEST FAILED: 

assistant: ```c
int main(int argc, char *argv[]) {
  (void)argc;
  (void)argv;
  uint8_t key[(128 / 8)] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
  uint8_t pt[(128 / 8)] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
  uint8_t ct[(128 / 8)] = {0x69, 0xC4, 0xE0, 0xD8, 0x6A, 0x7B, 0x04, 0x30, 0xD8, 0xCD, 0xB7, 0x80, 0x70, 0xB4, 0xC5, 0x5A};
  uint8_t oute[(128 / 8)] = {0x00};
  uint8_t outd[(128 / 8)] = {0x00};
  uint8_t kxe[(11 * 16)] = {0x00};
  uint8_t kxd[(11 * 16)] = {0x00};
  AES_128_generate_tables();
  AES_128_key_exp_enc_asm(key, kxe);
  AES_128_encrypt_asm(pt, oute, kxe);
  if (memcmp(oute, ct, sizeof(ct)) == 0) {
    printf("ENCRYPT TEST PASSED: ");
  } else {
    printf("ENCRYPT TEST FAILED: ");
  }
  printx(oute, (128 / 8));
  printf(" vs. ");
  printx(ct, (128 / 8));
  printf("\r\n");
  AES_128_key_exp_dec_asm(key, kxd);
  AES_128_decrypt_asm(ct, outd, kxd);
  if (memcmp(outd, pt, sizeof(pt)) == 0) {
    printf("DECRYPT TEST PASSED: ");
  } else {
    printf("DECRYPT TEST FAILED: ");
  }
  printx(outd, (128 / 8));
  printf(" vs. ");
  printx(pt, (128 / 8));
  printf("\r\n");
  return 0;
}
```