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

```asm
<wep_copy>:
  endbr64
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rsi,%rdi
  sub    $0x8,%rsp
  call   <strlen@plt>
  mov    %eax,%edi
  shr    $0x1f,%edi
  add    %eax,%edi
  sar    %edi
  cmp    $0x1,%eax
  jle    L40
  mov    %edi,%edx
  lea    0x0(%rbp,%rdx,2),%rcx
  cmp    %rcx,%rbx
  setae  %cl
  add    %rbx,%rdx
  cmp    %rdx,%rbp
  setae  %dl
  or     %dl,%cl
  je     L48
  cmp    $0x1f,%eax
  jle    L48
  movdqa D40(%rip),%xmm9
  mov    %edi,%edx
  xor    %eax,%eax
  movdqa D42(%rip),%xmm8
  shr    $0x4,%edx
  pxor   %xmm13,%xmm13
  movdqa D46(%rip),%xmm12
  movdqa D1(%rip),%xmm11
  movdqa D19(%rip),%xmm10
  shl    $0x4,%rdx
  psubd  %xmm9,%xmm8
  nopl   0x0(%rax,%rax,1)
L26:
  movdqu 0x0(%rbp,%rax,2),%xmm1
  movdqu 0x10(%rbp,%rax,2),%xmm0
  movdqa %xmm13,%xmm15
  movdqu 0x10(%rbp,%rax,2),%xmm2
  pand   %xmm12,%xmm0
  pand   %xmm12,%xmm1
  packuswb %xmm0,%xmm1
  movdqu 0x0(%rbp,%rax,2),%xmm0
  psrlw  $0x8,%xmm2
  movdqa %xmm1,%xmm5
  psrlw  $0x8,%xmm0
  packuswb %xmm2,%xmm0
  pxor   %xmm2,%xmm2
  pcmpgtb %xmm1,%xmm2
  movdqa %xmm0,%xmm4
  punpcklbw %xmm2,%xmm5
  punpckhbw %xmm2,%xmm1
  movdqa %xmm13,%xmm2
  pcmpgtw %xmm5,%xmm2
  movdqa %xmm5,%xmm6
  movdqa %xmm1,%xmm7
  punpcklwd %xmm2,%xmm6
  punpckhwd %xmm2,%xmm5
  movdqa %xmm13,%xmm2
  pcmpgtw %xmm1,%xmm2
  punpcklwd %xmm2,%xmm7
  punpckhwd %xmm2,%xmm1
  pxor   %xmm2,%xmm2
  pcmpgtb %xmm0,%xmm2
  punpckhbw %xmm2,%xmm0
  punpcklbw %xmm2,%xmm4
  movdqa %xmm13,%xmm2
  pcmpgtw %xmm4,%xmm2
  pcmpgtw %xmm0,%xmm15
  movdqa %xmm4,%xmm14
  movdqa %xmm0,%xmm3
  punpcklwd %xmm2,%xmm14
  punpckhwd %xmm2,%xmm4
  movdqa %xmm0,%xmm2
  punpcklwd %xmm15,%xmm2
  punpckhwd %xmm15,%xmm3
  movdqa %xmm11,%xmm15
  paddd  %xmm6,%xmm15
  paddd  %xmm10,%xmm6
  movdqa %xmm15,%xmm0
  psubd  %xmm9,%xmm0
  pcmpgtd %xmm8,%xmm0
  pand   %xmm0,%xmm6
  pandn  %xmm15,%xmm0
  movdqa %xmm11,%xmm15
  paddd  %xmm5,%xmm15
  por    %xmm6,%xmm0
  paddd  %xmm10,%xmm5
  movdqa %xmm15,%xmm6
  psubd  %xmm9,%xmm6
  pcmpgtd %xmm8,%xmm6
  pand   %xmm6,%xmm5
  pandn  %xmm15,%xmm6
  movdqa %xmm11,%xmm15
  paddd  %xmm7,%xmm15
  por    %xmm5,%xmm6
  paddd  %xmm10,%xmm7
  movdqa %xmm15,%xmm5
  psubd  %xmm9,%xmm5
  pcmpgtd %xmm8,%xmm5
  pand   %xmm5,%xmm7
  pandn  %xmm15,%xmm5
  movdqa %xmm11,%xmm15
  paddd  %xmm1,%xmm15
  por    %xmm7,%xmm5
  paddd  %xmm10,%xmm1
  movdqa %xmm15,%xmm7
  psubd  %xmm9,%xmm7
  pcmpgtd %xmm8,%xmm7
  pand   %xmm7,%xmm1
  pandn  %xmm15,%xmm7
  movdqa %xmm11,%xmm15
  paddd  %xmm14,%xmm15
  por    %xmm1,%xmm7
  paddd  %xmm10,%xmm14
  movdqa %xmm15,%xmm1
  psubd  %xmm9,%xmm1
  pcmpgtd %xmm8,%xmm1
  pand   %xmm1,%xmm14
  pandn  %xmm15,%xmm1
  movdqa %xmm11,%xmm15
  paddd  %xmm4,%xmm15
  por    %xmm14,%xmm1
  paddd  %xmm10,%xmm4
  movdqa %xmm15,%xmm14
  psubd  %xmm9,%xmm14
  pcmpgtd %xmm8,%xmm14
  pand   %xmm14,%xmm4
  pandn  %xmm15,%xmm14
  movdqa %xmm11,%xmm15
  paddd  %xmm2,%xmm15
  por    %xmm14,%xmm4
  paddd  %xmm10,%xmm2
  movdqa %xmm15,%xmm14
  psubd  %xmm9,%xmm14
  pcmpgtd %xmm8,%xmm14
  pand   %xmm14,%xmm2
  pandn  %xmm15,%xmm14
  movdqa %xmm11,%xmm15
  paddd  %xmm3,%xmm15
  por    %xmm14,%xmm2
  paddd  %xmm10,%xmm3
  movdqa %xmm15,%xmm14
  psubd  %xmm9,%xmm14
  pcmpgtd %xmm8,%xmm14
  pand   %xmm14,%xmm3
  pandn  %xmm15,%xmm14
  por    %xmm14,%xmm3
  movdqa %xmm0,%xmm14
  punpcklwd %xmm6,%xmm0
  punpckhwd %xmm6,%xmm14
  movdqa %xmm0,%xmm6
  punpckhwd %xmm14,%xmm6
  punpcklwd %xmm14,%xmm0
  punpcklwd %xmm6,%xmm0
  movdqa %xmm5,%xmm6
  punpcklwd %xmm7,%xmm5
  punpckhwd %xmm7,%xmm6
  movdqa %xmm5,%xmm7
  pand   %xmm12,%xmm0
  punpckhwd %xmm6,%xmm7
  punpcklwd %xmm6,%xmm5
  punpcklwd %xmm7,%xmm5
  pand   %xmm12,%xmm5
  packuswb %xmm5,%xmm0
  movdqa %xmm1,%xmm5
  punpcklwd %xmm4,%xmm1
  punpckhwd %xmm4,%xmm5
  movdqa %xmm1,%xmm4
  paddb  %xmm0,%xmm0
  punpckhwd %xmm5,%xmm4
  punpcklwd %xmm5,%xmm1
  paddb  %xmm0,%xmm0
  punpcklwd %xmm4,%xmm1
  movdqa %xmm2,%xmm4
  punpcklwd %xmm3,%xmm2
  punpckhwd %xmm3,%xmm4
  movdqa %xmm2,%xmm3
  paddb  %xmm0,%xmm0
  punpckhwd %xmm4,%xmm3
  punpcklwd %xmm4,%xmm2
  pand   %xmm12,%xmm1
  punpcklwd %xmm3,%xmm2
  paddb  %xmm0,%xmm0
  pand   %xmm12,%xmm2
  packuswb %xmm2,%xmm1
  por    %xmm1,%xmm0
  movups %xmm0,(%rbx,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L26
  mov    %edi,%edx
  and    $0xfffffff0,%edx
  test   $0xf,%dil
  je     L40
  movslq %edx,%rdx
  nopl   0x0(%rax)
L28:
  movsbl 0x0(%rbp,%rdx,2),%eax
  movsbl 0x1(%rbp,%rdx,2),%esi
  lea    -0x30(%rax),%ecx
  sub    $0x37,%eax
  cmp    $0x9,%ecx
  cmovbe %ecx,%eax
  lea    -0x30(%rsi),%ecx
  sub    $0x37,%esi
  cmp    $0xa,%ecx
  cmovae %esi,%ecx
  shl    $0x4,%eax
  or     %ecx,%eax
  mov    %al,(%rbx,%rdx,1)
  add    $0x1,%rdx
  cmp    %edx,%edi
  jg     L28
L40:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L48:
  xor    %ecx,%ecx
  nopw   0x0(%rax,%rax,1)
L15:
  movsbl 0x0(%rbp,%rcx,2),%eax
  movsbl 0x1(%rbp,%rcx,2),%edx
  lea    -0x30(%rax),%esi
  sub    $0x37,%eax
  cmp    $0x9,%esi
  cmovbe %esi,%eax
  lea    -0x30(%rdx),%esi
  sub    $0x37,%edx
  cmp    $0x9,%esi
  cmovbe %esi,%edx
  shl    $0x4,%eax
  or     %edx,%eax
  mov    %al,(%rbx,%rcx,1)
  add    $0x1,%rcx
  cmp    %ecx,%edi
  jg     L15
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
```

tool_calls: name: unpack_data
arguments: label: D40
type_infered: byte[16]
name: unpack_data
arguments: label: D42
type_infered: byte[16]
name: unpack_data
arguments: label: D46
type_infered: byte[16]
name: unpack_data
arguments: label: D1
type_infered: byte[16]
name: unpack_data
arguments: label: D19
type_infered: byte[16]

tool: {"D40": [0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80]}

tool: {"D42": [0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00]}

tool: {"D46": [0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]}

tool: {"D1": [0xd0,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd0,0xff,0xff,0xff]}

tool: {"D19": [0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff]}

assistant: ```c
void wep_copy(char *buf, char *key) {
  int i, len;
  len = strlen(key) / 2;
  for (i = 0; i < len; i++) {
    int h, l;
    h = key[i * 2];
    l = key[i * 2 + 1];
    if ((h >= '0') && (h <= '9')) {
      h = h - '0';
    } else {
      h = h - 'A' + 10;
    }
    if ((l >= '0') && (l <= '9')) {
      l = l - '0';
    } else {
      l = l - 'A' + 10;
    }
    buf[i] = (h << 4) | l;
  }
}
```