user: 这段汇编代码用C语言表示是什么样的?

```asm
<hex2binary>:
  endbr64
  push   %r13
  mov    %esi,%r13d
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  shr    $0x1f,%r12d
  mov    %rdx,%rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %esi,%edi
  add    %esi,%r12d
  not    %edi
  sar    %r12d
  and    $0x1,%edi
  sub    $0x8,%rsp
  call   <assert@plt>
  cmp    $0x1,%r13d
  jle    L88
  mov    %r12d,%eax
  lea    (%rbx,%rax,2),%rdx
  cmp    %rdx,%rbp
  setae  %dl
  add    %rbp,%rax
  cmp    %rax,%rbx
  setae  %al
  or     %al,%dl
  je     L1
  cmp    $0x1f,%r13d
  jle    L1
  mov    %r12d,%edx
  movdqa D14(%rip),%xmm5
  movdqa D12(%rip),%xmm4
  xor    %eax,%eax
  shr    $0x4,%edx
  movdqa D15(%rip),%xmm3
  movdqa D3(%rip),%xmm2
  pxor   %xmm1,%xmm1
  shl    $0x4,%rdx
  nopw   0x0(%rax,%rax,1)
L53:
  movdqu (%rbx,%rax,2),%xmm0
  movdqu 0x10(%rbx,%rax,2),%xmm6
  movdqa %xmm0,%xmm7
  movdqa %xmm6,%xmm8
  pand   %xmm5,%xmm0
  psrlw  $0x8,%xmm8
  psrlw  $0x8,%xmm7
  pand   %xmm5,%xmm6
  packuswb %xmm6,%xmm0
  packuswb %xmm8,%xmm7
  movdqa %xmm0,%xmm8
  movdqa %xmm0,%xmm6
  paddb  %xmm4,%xmm8
  paddb  %xmm2,%xmm6
  movdqa %xmm8,%xmm0
  psubusb %xmm3,%xmm0
  pcmpeqb %xmm1,%xmm0
  pand   %xmm0,%xmm8
  pandn  %xmm6,%xmm0
  por    %xmm8,%xmm0
  movdqa %xmm7,%xmm8
  paddb  %xmm2,%xmm7
  paddb  %xmm4,%xmm8
  paddb  %xmm0,%xmm0
  movdqa %xmm8,%xmm6
  paddb  %xmm0,%xmm0
  psubusb %xmm3,%xmm6
  paddb  %xmm0,%xmm0
  pcmpeqb %xmm1,%xmm6
  paddb  %xmm0,%xmm0
  pand   %xmm6,%xmm8
  pandn  %xmm7,%xmm6
  por    %xmm8,%xmm6
  paddb  %xmm6,%xmm0
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%rdx
  jne    L53
  mov    %r12d,%edx
  and    $0xfffffff0,%edx
  test   $0xf,%r12b
  je     L88
  movslq %edx,%rdx
  nopl   0x0(%rax,%rax,1)
L16:
  movzbl (%rbx,%rdx,2),%ecx
  lea    -0x30(%rcx),%eax
  sub    $0x37,%ecx
  cmp    $0x9,%al
  cmova  %ecx,%eax
  movzbl 0x1(%rbx,%rdx,2),%ecx
  lea    -0x30(%rcx),%esi
  shl    $0x4,%eax
  cmp    $0x9,%sil
  ja     L8
  add    %esi,%eax
  mov    %al,0x0(%rbp,%rdx,1)
  add    $0x1,%rdx
  cmp    %edx,%r12d
  jg     L16
L88:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopw   0x0(%rax,%rax,1)
L8:
  lea    -0x37(%rcx,%rax,1),%ecx
  mov    %cl,0x0(%rbp,%rdx,1)
  add    $0x1,%rdx
  cmp    %edx,%r12d
  jg     L16
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L1:
  xor    %edx,%edx
  nopw   0x0(%rax,%rax,1)
L24:
  movzbl (%rbx,%rdx,2),%ecx
  lea    -0x30(%rcx),%eax
  sub    $0x37,%ecx
  cmp    $0x9,%al
  cmova  %ecx,%eax
  movzbl 0x1(%rbx,%rdx,2),%ecx
  lea    -0x30(%rcx),%esi
  shl    $0x4,%eax
  cmp    $0x9,%sil
  jbe    L68
  lea    -0x37(%rcx,%rax,1),%ecx
  mov    %cl,0x0(%rbp,%rdx,1)
  add    $0x1,%rdx
  cmp    %edx,%r12d
  jg     L24
  jmp    L88
  nopl   0x0(%rax,%rax,1)
L68:
  add    %esi,%eax
  mov    %al,0x0(%rbp,%rdx,1)
  add    $0x1,%rdx
  cmp    %edx,%r12d
  jg     L24
  jmp    L88
```

tool_calls: name: retrieve_data
arguments: label: D14
type_guessed: byte[16]
name: retrieve_data
arguments: label: D12
type_guessed: byte[16]
name: retrieve_data
arguments: label: D15
type_guessed: byte[16]
name: retrieve_data
arguments: label: D3
type_guessed: byte[16]

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

tool: {"D12": [0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0]}

tool: {"D15": [0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09]}

tool: {"D3": [0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9]}

assistant: ```c
void hex2binary(const char *hex_str, int h_size, char *byte_str) {
  int size = h_size / 2;
  char h, l;
  assert((h_size % 2) == 0);
  for (int i = 0; i < size; ++i) {
    char c = hex_str[i * 2];
    if (c >= '0' && c <= '9')
      h = c - 48;
    else
      h = c + 10 - 65;
    c = hex_str[i * 2 + 1];
    if ((c >= '0') && (c <= '9'))
      l = c - 48;
    else
      l = c + 10 - 65;
    byte_str[i] = (h << 4) + l;
  }
}
```