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

```asm
<bytes_to_base32hex>:
  endbr64
  push   %r13
  mov    %rsi,%r13
  push   %r12
  mov    %rdi,%r12
  mov    %rcx,%rdi
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x8,%rsp
  call   <base32hex_len@plt>
  xor    %r8d,%r8d
  add    $0x1,%eax
  cltq
  cmp    %r13,%rax
  jne    L104
  mov    %r12,%rax
  test   %rbp,%rbp
  jne    L114
  jmp    L51
L116:
  mov    %rcx,%rbx
L114:
  mov    (%rbx),%edx
  sar    $0x3,%edx
  mov    %edx,(%rax)
  mov    (%rbx),%edi
  lea    0x0(,%rdi,4),%edx
  and    $0x1c,%edx
  mov    %edx,0x4(%rax)
  cmp    $0x1,%rbp
  je     L51
  mov    0x4(%rbx),%edx
  sar    $0x6,%edx
  and    $0x3,%edx
  or     %edx,0x4(%rax)
  mov    0x4(%rbx),%edx
  sar    %edx
  and    $0x1f,%edx
  mov    %edx,0x8(%rax)
  mov    0x4(%rbx),%edx
  shl    $0x4,%edx
  and    $0x10,%edx
  mov    %edx,0xc(%rax)
  cmp    $0x2,%rbp
  je     L51
  mov    0x8(%rbx),%edx
  sar    $0x4,%edx
  and    $0xf,%edx
  or     %edx,0xc(%rax)
  mov    0x8(%rbx),%esi
  lea    (%rsi,%rsi,1),%edx
  and    $0x1e,%edx
  mov    %edx,0x10(%rax)
  cmp    $0x3,%rbp
  je     L51
  mov    0xc(%rbx),%edx
  sar    $0x7,%edx
  and    $0x1,%edx
  or     %edx,0x10(%rax)
  mov    0xc(%rbx),%edx
  sar    $0x2,%edx
  and    $0x1f,%edx
  mov    %edx,0x14(%rax)
  mov    0xc(%rbx),%edi
  lea    0x0(,%rdi,8),%edx
  and    $0x18,%edx
  mov    %edx,0x18(%rax)
  cmp    $0x4,%rbp
  je     L51
  mov    0x10(%rbx),%edx
  lea    0x14(%rbx),%rcx
  sar    $0x5,%edx
  and    $0x7,%edx
  or     %edx,0x18(%rax)
  mov    0x10(%rbx),%edx
  add    $0x20,%rax
  and    $0x1f,%edx
  mov    %edx,-0x4(%rax)
  sub    $0x5,%rbp
  jne    L116
L51:
  cmp    $0x1,%r13
  je     L120
  lea    -0x4(%r12,%r13,4),%rsi
  mov    %r12,%rax
  mov    $0x3f,%edi
  jmp    L49
  nopl   0x0(%rax)
L96:
  add    $0x30,%edx
  add    $0x4,%rax
  mov    %edx,-0x4(%rax)
  cmp    %rsi,%rax
  je     L120
L49:
  mov    (%rax),%edx
  cmp    $0x9,%edx
  jle    L96
  cmp    $0x20,%edx
  lea    0x57(%rdx),%ecx
  cmovge %edi,%ecx
  add    $0x4,%rax
  mov    %ecx,%edx
  mov    %edx,-0x4(%rax)
  cmp    %rsi,%rax
  jne    L49
L120:
  movb   $0x0,-0x1(%r12,%r13,1)
  mov    %r12,%r8
L104:
  add    $0x8,%rsp
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

assistant: ```c
char *bytes_to_base32hex(char dst[], size_t dstsize, const uint8_t *src, size_t srcsize) {
  const uint8_t *s = src;
  int byte = 0;
  uint8_t *d = (uint8_t *)dst;
  int i;
  if (dstsize != (base32hex_len(srcsize) + 1)) {
    return NULL;
  }
  while (srcsize) {
    switch (byte) {
    case 0:
      d[0] = *s >> 3;
      d[1] = (*s & 0x07) << 2;
      break;
    case 1:
      d[1] |= (*s >> 6) & 0x03;
      d[2] = (*s >> 1) & 0x1f;
      d[3] = (*s & 0x01) << 4;
      break;
    case 2:
      d[3] |= (*s >> 4) & 0x0f;
      d[4] = (*s & 0x0f) << 1;
      break;
    case 3:
      d[4] |= (*s >> 7) & 0x01;
      d[5] = (*s >> 2) & 0x1f;
      d[6] = (*s & 0x03) << 3;
      break;
    case 4:
      d[6] |= (*s >> 5) & 0x07;
      d[7] = *s & 0x1f;
      break;
    }
    srcsize--;
    s++;
    byte++;
    if (byte == 5) {
      d += 8;
      byte = 0;
    }
  }
  d = (uint8_t *)dst;
  dstsize--;
  for (i = 0; i < dstsize; i++) {
    if (*d < 10) {
      *d = *d + '0';
    } else if (*d < 32) {
      *d = *d - 10 + 'a';
    } else {
      *d = '?';
    }
    d++;
  }
  dst[dstsize] = '\0';
  return dst;
}
```