user: 下面的汇编指令对应的C源代码是什么:

```asm
<utf8_to_string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  movq   $0x0,-0x28(%rbp)
  mov    -0x40(%rbp),%rax
  and    $0x80,%eax
  test   %rax,%rax
  je     L62
  mov    -0x40(%rbp),%rax
  shr    $0x18,%rax
  and    $0x7f,%eax
  mov    %rax,-0x10(%rbp)
  mov    -0x40(%rbp),%rax
  shr    $0x10,%rax
  and    $0x7f,%eax
  mov    %rax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  shr    $0x8,%rax
  and    $0x7f,%eax
  mov    %rax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  and    $0x3f,%eax
  mov    %rax,-0x8(%rbp)
  andq   $0x7,-0x10(%rbp)
  mov    -0x20(%rbp),%rax
  and    $0x40,%eax
  test   %rax,%rax
  je     L2
  andq   $0xf,-0x20(%rbp)
L2:
  mov    -0x18(%rbp),%rax
  and    $0x40,%eax
  test   %rax,%rax
  je     L73
  andq   $0x1f,-0x18(%rbp)
L73:
  mov    -0x18(%rbp),%rax
  shl    $0x6,%rax
  or     -0x8(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  shl    $0xc,%rax
  or     %rax,%rdx
  mov    -0x10(%rbp),%rax
  shl    $0x10,%rax
  or     %rdx,%rax
  mov    %rax,-0x28(%rbp)
  jmp    L24
L62:
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x28(%rbp)
L24:
  cmpq   $0x7f,-0x28(%rbp)
  ja     L35
  mov    -0x28(%rbp),%rax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x1,%rax
  movb   $0x0,(%rax)
  mov    $0x1,%eax
  jmp    L60
L35:
  cmpq   $0xfffe,-0x28(%rbp)
  ja     L7
  mov    -0x38(%rbp),%rax
  movb   $0x5c,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x1,%rax
  movb   $0x75,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0xc,%rax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0x8,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0x4,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x5,%rax
  mov    %dl,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x6,%rax
  movb   $0x0,(%rax)
  mov    $0x6,%eax
  jmp    L60
L7:
  mov    -0x38(%rbp),%rax
  movb   $0x5c,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x1,%rax
  movb   $0x55,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x2,%rax
  movb   $0x30,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0x3,%rax
  movb   $0x30,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0x14,%rax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0x10,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x5,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0xc,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x6,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0x8,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x7,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  shr    $0x4,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  movzbl (%rdx,%rax,1),%edx
  mov    -0x38(%rbp),%rax
  add    $0x9,%rax
  mov    %dl,(%rax)
  mov    -0x38(%rbp),%rax
  add    $0xa,%rax
  movb   $0x0,(%rax)
  mov    $0xa,%eax
L60:
  pop    %rbp
  ret
```

assistant: ```c
int utf8_to_string(unsigned char buf[], unsigned long utf8) {
  unsigned long val = 0;
  static char hex[16] = "0123456789abcdef";
  if (utf8 & 0x80UL) {
    unsigned long x1, x2, x3, x4;
    x1 = (utf8 >> 24) & 0x7fUL;
    x2 = (utf8 >> 16) & 0x7fUL;
    x3 = (utf8 >> 8) & 0x7fUL;
    x4 = (utf8)&0x3fUL;
    x1 &= 0x07UL;
    if (x2 & 0x40UL)
      x2 &= 0x0fUL;
    if (x3 & 0x40UL)
      x3 &= 0x1fUL;
    val = x4 | (x3 << 6) | (x2 << 12) | (x1 << 16);
  } else
    val = utf8;
  if (val < 128) {
    buf[0] = val;
    buf[1] = 0;
    return 1;
  } else if (val < 0xffffUL) {
    buf[0] = '\\';
    buf[1] = 'u';
    buf[2] = hex[(size_t)(val >> 12)];
    buf[3] = hex[(size_t)((val >> 8) & 0xfU)];
    buf[4] = hex[(size_t)((val >> 4) & 0xfU)];
    buf[5] = hex[(size_t)(val & 0xfU)];
    buf[6] = 0;
    return 6;
  }
  buf[0] = '\\';
  buf[1] = 'U';
  buf[2] = '0';
  buf[3] = '0';
  buf[4] = hex[(size_t)(val >> 20)];
  buf[5] = hex[(size_t)((val >> 16) & 0xfU)];
  buf[6] = hex[(size_t)((val >> 12) & 0xfU)];
  buf[7] = hex[(size_t)((val >> 8) & 0xfU)];
  buf[8] = hex[(size_t)((val >> 4) & 0xfU)];
  buf[9] = hex[(size_t)(val & 0xfU)];
  buf[10] = 0;
  return 10;
}
```