user: 请将以下的汇编代码转换成C语言代码:

```asm
<convert_string>:
  endbr64
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  mov    %esi,%ebp
  shr    $0x1f,%ebp
  push   %rbx
  mov    %rdi,%rbx
  add    %esi,%ebp
  sar    %ebp
  mov    %ebp,%edi
  call   <malloc@plt>
  mov    %rax,%r8
  test   %r12d,%r12d
  jle    L200
  lea    -0x1(%r12),%eax
  mov    %eax,%edx
  shr    %edx
  lea    0x1(%rdx),%ecx
  lea    -0x1(%rbx,%rcx,2),%rsi
  mov    %rcx,%rdx
  cmp    %rsi,%r8
  setae  %sil
  add    %r8,%rcx
  cmp    %rcx,%rbx
  setae  %cl
  or     %cl,%sil
  je     L207
  cmp    $0x1f,%eax
  jbe    L207
  shr    $0x5,%eax
  movdqa D2(%rip),%xmm2
  mov    %eax,%edx
  xor    %eax,%eax
  mov    %rdx,%rcx
  shl    $0x4,%rdx
  cs nopw 0x0(%rax,%rax,1)
L115:
  movdqu (%rbx,%rax,2),%xmm0
  movdqu 0x10(%rbx,%rax,2),%xmm1
  pand   %xmm2,%xmm0
  pand   %xmm2,%xmm1
  packuswb %xmm1,%xmm0
  movups %xmm0,(%r8,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L115
  mov    %ecx,%eax
  mov    %ecx,%edx
  shl    $0x5,%eax
  shl    $0x4,%edx
  movslq %eax,%rcx
  movzbl (%rbx,%rcx,1),%esi
  mov    %edx,%ecx
  mov    %sil,(%r8,%rcx,1)
  lea    0x2(%rax),%ecx
  lea    0x1(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x4(%rax),%ecx
  lea    0x2(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x6(%rax),%ecx
  lea    0x3(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x8(%rax),%ecx
  lea    0x4(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0xa(%rax),%ecx
  lea    0x5(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0xc(%rax),%ecx
  lea    0x6(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0xe(%rax),%ecx
  lea    0x7(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x10(%rax),%ecx
  lea    0x8(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x12(%rax),%ecx
  lea    0x9(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x14(%rax),%ecx
  lea    0xa(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x16(%rax),%ecx
  lea    0xb(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x18(%rax),%ecx
  lea    0xc(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x1a(%rax),%ecx
  lea    0xd(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  lea    0x1c(%rax),%ecx
  lea    0xe(%rdx),%esi
  cmp    %ecx,%r12d
  jle    L200
  movslq %ecx,%rcx
  movslq %esi,%rsi
  add    $0x1e,%eax
  add    $0xf,%edx
  movzbl (%rbx,%rcx,1),%ecx
  mov    %cl,(%r8,%rsi,1)
  cmp    %eax,%r12d
  jle    L200
  cltq
  movslq %edx,%rdx
  movzbl (%rbx,%rax,1),%eax
  mov    %al,(%r8,%rdx,1)
L200:
  movslq %ebp,%rbp
  mov    %r8,%rax
  movb   $0x0,-0x1(%r8,%rbp,1)
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L207:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L68:
  movzbl (%rbx,%rax,2),%ecx
  mov    %cl,(%r8,%rax,1)
  add    $0x1,%rax
  cmp    %rdx,%rax
  jne    L68
  jmp    L200
```

tool_calls: name: read_data
arguments: data_label: D2
type_guessed: byte[16]

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

assistant: ```c
char *convert_string(void *string, int len) {
  int i, k;
  int reallen = len / 2;
  char *cstring = malloc(reallen);
  for (i = 0, k = 0; i < len; i += 2, k++) {
    cstring[k] = ((char *)string)[i];
  }
  cstring[reallen - 1] = '\0';
  return cstring;
}
```