user: Please show me the C implementation that matches the assembly code listed below:

```asm
<test_copy>:
  endbr64
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  movb   $0x0,0xe(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x1,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jne    L38
L96:
  movb   $0x0,0xe(%rsp)
  movb   $0x0,0xf(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x2,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jne    L214
L256:
  movb   $0x31,0xe(%rsp)
  movb   $0x0,0xf(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x2,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  jne    L203
L250:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x3,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  jne    L108
L257:
  movb   $0x31,0xe(%rsp)
  movb   $0x0,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x2,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  jne    L247
L55:
  movb   $0x31,0xe(%rsp)
  movb   $0x0,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x4,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  jne    L179
L139:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x3,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  jne    L49
L157:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x4,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  jne    L208
L263:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x33,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x4,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x3,%eax
  jne    L232
L98:
  movb   $0x31,0xe(%rsp)
  movb   $0x0,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x4,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  jne    L227
L71:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x0,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x4,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  jne    L73
L237:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x33,0x10(%rsp)
  movb   $0x0,0x11(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x4,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x3,%eax
  jne    L259
L94:
  movb   $0x31,0xe(%rsp)
  movb   $0x32,0xf(%rsp)
  movb   $0x33,0x10(%rsp)
  movb   $0x34,0x11(%rsp)
  movb   $0x0,0x12(%rsp)
  lea    0xe(%rsp),%rsi
  lea    0x13(%rsp),%rbx
  mov    $0x5,%edx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x4,%eax
  jne    L226
L97:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L196
  add    $0x20,%rsp
  pop    %rbx
  ret
L38:
  call   <call_not_eliminated_on_line_44@plt>
  jmp    L96
L214:
  call   <call_not_eliminated_on_line_45@plt>
  jmp    L256
L203:
  call   <call_not_eliminated_on_line_46@plt>
  jmp    L250
L108:
  call   <call_not_eliminated_on_line_47@plt>
  jmp    L257
L247:
  call   <call_not_eliminated_on_line_50@plt>
  jmp    L55
L179:
  call   <call_not_eliminated_on_line_53@plt>
  jmp    L139
L49:
  call   <call_not_eliminated_on_line_54@plt>
  jmp    L157
L208:
  call   <call_not_eliminated_on_line_55@plt>
  jmp    L263
L232:
  call   <call_not_eliminated_on_line_56@plt>
  jmp    L98
L227:
  call   <call_not_eliminated_on_line_57@plt>
  jmp    L71
L73:
  call   <call_not_eliminated_on_line_58@plt>
  jmp    L237
L259:
  call   <call_not_eliminated_on_line_59@plt>
  jmp    L94
L226:
  call   <call_not_eliminated_on_line_64@plt>
  jmp    L97
L196:
  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);
}
```