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

```asm
<ne_md5_to_ascii>:
  endbr64
  lea    0x20(%rsi),%rcx
  mov    %rdi,%rdx
  mov    %rsi,%rax
  cmp    %rcx,%rdi
  jae    L6
  lea    0x10(%rdi),%rcx
  cmp    %rcx,%rsi
  jb     L17
L6:
  movdqu (%rdx),%xmm1
  movdqa D8(%rip),%xmm7
  pxor   %xmm5,%xmm5
  movb   $0x0,0x20(%rax)
  movdqa D39(%rip),%xmm6
  movdqa D22(%rip),%xmm2
  movdqa %xmm1,%xmm0
  movdqa D31(%rip),%xmm3
  pand   %xmm7,%xmm1
  psrlw  $0x4,%xmm0
  pand   %xmm7,%xmm0
  movdqa %xmm0,%xmm4
  movdqa %xmm0,%xmm8
  psubusb %xmm6,%xmm0
  pcmpeqb %xmm5,%xmm0
  paddb  %xmm2,%xmm4
  paddb  %xmm3,%xmm8
  paddb  %xmm1,%xmm2
  paddb  %xmm1,%xmm3
  psubusb %xmm6,%xmm1
  pcmpeqb %xmm5,%xmm1
  pand   %xmm0,%xmm4
  pandn  %xmm8,%xmm0
  por    %xmm4,%xmm0
  pand   %xmm1,%xmm2
  pandn  %xmm3,%xmm1
  por    %xmm2,%xmm1
  movdqa %xmm0,%xmm2
  punpcklbw %xmm1,%xmm2
  punpckhbw %xmm1,%xmm0
  movups %xmm2,(%rax)
  movups %xmm0,0x10(%rax)
  ret
  nopl   0x0(%rax)
L17:
  movzbl (%rdi),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,(%rax)
  movzbl (%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x1(%rax)
  movzbl 0x1(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x2(%rax)
  movzbl 0x1(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x3(%rax)
  movzbl 0x2(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x4(%rax)
  movzbl 0x2(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x5(%rax)
  movzbl 0x3(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x6(%rax)
  movzbl 0x3(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x7(%rax)
  movzbl 0x4(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x8(%rax)
  movzbl 0x4(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x9(%rax)
  movzbl 0x5(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0xa(%rax)
  movzbl 0x5(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0xb(%rax)
  movzbl 0x6(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0xc(%rax)
  movzbl 0x6(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0xd(%rax)
  movzbl 0x7(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0xe(%rax)
  movzbl 0x7(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0xf(%rax)
  movzbl 0x8(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x10(%rax)
  movzbl 0x8(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x11(%rax)
  movzbl 0x9(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x12(%rax)
  movzbl 0x9(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x13(%rax)
  movzbl 0xa(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x14(%rax)
  movzbl 0xa(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x15(%rax)
  movzbl 0xb(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x16(%rax)
  movzbl 0xb(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x17(%rax)
  movzbl 0xc(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x18(%rax)
  movzbl 0xc(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x19(%rax)
  movzbl 0xd(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x1a(%rax)
  movzbl 0xd(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x1b(%rax)
  movzbl 0xe(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x1c(%rax)
  movzbl 0xe(%rdx),%ecx
  and    $0xf,%ecx
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x1d(%rax)
  movzbl 0xf(%rdx),%ecx
  shr    $0x4,%cl
  cmp    $0xa,%cl
  lea    0x30(%rcx),%esi
  lea    0x57(%rcx),%edi
  cmovb  %esi,%edi
  mov    %dil,0x1e(%rax)
  movzbl 0xf(%rdx),%edx
  and    $0xf,%edx
  lea    0x57(%rdx),%esi
  lea    0x30(%rdx),%ecx
  cmp    $0xa,%dl
  mov    %esi,%edx
  cmovb  %ecx,%edx
  mov    %dl,0x1f(%rax)
  movb   $0x0,0x20(%rax)
  ret
```

tool_calls: name: disassemble_data
arguments: label: D8
datatype: byte[16]
name: disassemble_data
arguments: label: D39
datatype: byte[16]
name: disassemble_data
arguments: label: D22
datatype: byte[16]
name: disassemble_data
arguments: label: D31
datatype: byte[16]

tool: {"D8": [0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f]}

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

tool: {"D22": [0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30]}

tool: {"D31": [0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57]}

assistant: ```c
void ne_md5_to_ascii(const unsigned char md5_buf[16], char *buffer) {
  int count;
  for (count = 0; count < 16; count++) {
    buffer[count * 2] = ((char)((md5_buf[count] >> 4) > 9 ? ((md5_buf[count] >> 4) - 10 + 'a') : ((md5_buf[count] >> 4) + '0')));
    buffer[count * 2 + 1] = ((char)((md5_buf[count] & 0x0f) > 9 ? ((md5_buf[count] & 0x0f) - 10 + 'a') : ((md5_buf[count] & 0x0f) + '0')));
  }
  buffer[32] = '\0';
}
```