user: Translate the below assembly code into C programming language:

```asm
<test_copy>:
  endbr64
  push   %r12
  mov    $0x1,%edx
  push   %rbp
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x13(%rsp),%rbp
  lea    0xe(%rsp),%r12
  movb   $0x0,0xe(%rsp)
  mov    %rbp,%rdi
  mov    %r12,%rsi
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jne    L147
L20:
  xor    %ecx,%ecx
  mov    %rbp,%rdi
  mov    $0x2,%edx
  mov    %r12,%rsi
  mov    %cx,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jne    L85
L141:
  mov    $0x31,%edx
  mov    %rbp,%rdi
  mov    %r12,%rsi
  mov    %dx,0xe(%rsp)
  mov    $0x2,%edx
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  je     L11
  call   <call_not_eliminated_on_line_46@plt>
L11:
  mov    $0x3231,%eax
  mov    %rbp,%rdi
  mov    $0x3,%edx
  mov    %r12,%rsi
  mov    %ax,0xe(%rsp)
  movb   $0x0,0x10(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  je     L146
  call   <call_not_eliminated_on_line_47@plt>
L146:
  mov    %rbp,%rdi
  mov    $0x2,%edx
  mov    %r12,%rsi
  movl   $0x31,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  je     L79
  call   <call_not_eliminated_on_line_50@plt>
L79:
  mov    %rbp,%rdi
  mov    $0x4,%edx
  mov    %r12,%rsi
  movl   $0x31,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  je     L105
  call   <call_not_eliminated_on_line_53@plt>
L105:
  mov    %rbp,%rdi
  mov    $0x3,%edx
  mov    %r12,%rsi
  movl   $0x3231,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  je     L125
  call   <call_not_eliminated_on_line_54@plt>
L125:
  mov    %rbp,%rdi
  mov    $0x4,%edx
  mov    %r12,%rsi
  movl   $0x3231,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  je     L114
  call   <call_not_eliminated_on_line_55@plt>
L114:
  mov    %rbp,%rdi
  mov    $0x4,%edx
  mov    %r12,%rsi
  movl   $0x333231,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x3,%eax
  je     L84
  call   <call_not_eliminated_on_line_56@plt>
L84:
  mov    %rbp,%rdi
  mov    $0x4,%edx
  mov    %r12,%rsi
  movl   $0x31,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  je     L62
  call   <call_not_eliminated_on_line_57@plt>
L62:
  mov    %rbp,%rdi
  mov    $0x4,%edx
  mov    %r12,%rsi
  movl   $0x3231,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  je     L41
  call   <call_not_eliminated_on_line_58@plt>
L41:
  mov    %rbp,%rdi
  mov    $0x4,%edx
  mov    %r12,%rsi
  movl   $0x333231,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x3,%eax
  je     L93
  call   <call_not_eliminated_on_line_59@plt>
L93:
  mov    %rbp,%rdi
  mov    $0x5,%edx
  mov    %r12,%rsi
  movb   $0x0,0x12(%rsp)
  movl   $0x34333231,0xe(%rsp)
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x4,%eax
  je     L4
  call   <call_not_eliminated_on_line_64@plt>
L4:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L131
  add    $0x28,%rsp
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L85:
  call   <call_not_eliminated_on_line_45@plt>
  jmp    L141
  nopw   0x0(%rax,%rax,1)
L147:
  call   <call_not_eliminated_on_line_44@plt>
  jmp    L20
L131:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void test_copy(void) {
  do {
    char a[2], b[2];
    (a[0] = 0);
    memcpy(b, a, 1);
    if ((!(0 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_44(void);
        call_not_eliminated_on_line_44();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[2], b[2];
    (a[0] = 0, a[1] = 0);
    memcpy(b, a, 2);
    if ((!(0 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_45(void);
        call_not_eliminated_on_line_45();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[2], b[2];
    (a[0] = '1', a[1] = 0);
    memcpy(b, a, 2);
    if ((!(1 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_46(void);
        call_not_eliminated_on_line_46();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[4], b[4];
    (a[0] = '1', a[1] = '2', a[2] = 0);
    memcpy(b, a, 3);
    if ((!(2 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_47(void);
        call_not_eliminated_on_line_47();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[4], b[4];
    (a[0] = '1', a[1] = 0, a[2] = 0, a[3] = 0);
    memcpy(b, a, 2);
    if ((!(1 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_50(void);
        call_not_eliminated_on_line_50();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[4], b[4];
    (a[0] = '1', a[1] = 0, a[2] = 0, a[3] = 0);
    memcpy(b, a, 4);
    if ((!(1 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_53(void);
        call_not_eliminated_on_line_53();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[4], b[4];
    (a[0] = '1', a[1] = '2', a[2] = 0, a[3] = 0);
    memcpy(b, a, 3);
    if ((!(2 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_54(void);
        call_not_eliminated_on_line_54();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[4], b[4];
    (a[0] = '1', a[1] = '2', a[2] = 0, a[3] = 0);
    memcpy(b, a, 4);
    if ((!(2 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_55(void);
        call_not_eliminated_on_line_55();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[4], b[4];
    (a[0] = '1', a[1] = '2', a[2] = '3', a[3] = 0);
    memcpy(b, a, 4);
    if ((!(3 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_56(void);
        call_not_eliminated_on_line_56();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[5], b[5];
    (a[0] = '1', a[1] = 0, a[2] = 0, a[3] = 0);
    memcpy(b, a, 4);
    if ((!(1 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_57(void);
        call_not_eliminated_on_line_57();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[5], b[5];
    (a[0] = '1', a[1] = '2', a[2] = 0, a[3] = 0);
    memcpy(b, a, 4);
    if ((!(2 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_58(void);
        call_not_eliminated_on_line_58();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[5], b[5];
    (a[0] = '1', a[1] = '2', a[2] = '3', a[3] = 0);
    memcpy(b, a, 4);
    if ((!(3 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_59(void);
        call_not_eliminated_on_line_59();
      } while (0);
    else
      (void)0;
  } while (0);
  do {
    char a[5], b[5];
    (a[0] = '1', a[1] = '2', a[2] = '3', a[3] = '4', a[4] = 0);
    memcpy(b, a, 5);
    if ((!(4 == strlen(b))))
      do {
        extern void call_not_eliminated_on_line_64(void);
        call_not_eliminated_on_line_64();
      } while (0);
    else
      (void)0;
  } while (0);
}
```