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

```asm
<vtkParse_DecodeUtf8>:
  endbr64
  mov    %rsi,%rcx
  mov    (%rdi),%rsi
  mov    %rdi,%rdx
  xor    %r9d,%r9d
  movzbl (%rsi),%r8d
  lea    0x1(%rsi),%rdi
  mov    %r8d,%eax
  test   %r8b,%r8b
  js     L55
L51:
  test   %rcx,%rcx
  je     L3
  mov    %r9d,(%rcx)
L3:
  mov    %rdi,(%rdx)
  mov    %r8d,%eax
  ret
  nop
L55:
  mov    %r8d,%r9d
  and    $0xffffffe0,%r9d
  cmp    $0xc0,%r9b
  je     L43
  mov    %r8d,%r9d
  and    $0xfffffff0,%r9d
  cmp    $0xe0,%r9b
  je     L75
  mov    %r8d,%r10d
  mov    $0x1,%r9d
  and    $0xfffffff8,%r10d
  cmp    $0xf0,%r10b
  jne    L51
  movzbl 0x1(%rsi),%esi
  and    $0x7,%eax
  xor    %r10d,%r10d
  shl    $0x6,%eax
  mov    %esi,%r9d
  and    $0xffffffc0,%r9d
  cmp    $0x80,%r9b
  mov    %esi,%r9d
  sete   %r10b
  and    $0x3f,%r9d
  add    %rdi,%r10
  or     %eax,%r9d
  movzbl (%r10),%eax
  shl    $0x6,%r9d
  mov    %eax,%esi
  and    $0xffffffc0,%esi
  cmp    $0x80,%sil
  sete   %sil
  movzbl %sil,%esi
  add    %rsi,%r10
  mov    %eax,%esi
  and    $0x3f,%esi
  or     %r9d,%esi
L68:
  movzbl (%r10),%eax
  shl    $0x6,%esi
  xor    %r11d,%r11d
  mov    %eax,%r9d
  and    $0xffffffc0,%r9d
  cmp    $0x80,%r9b
  sete   %r9b
  sete   %r11b
  and    $0x3f,%eax
  movzbl %r9b,%r9d
  or     %esi,%eax
  add    %r9,%r10
L2:
  mov    %r11d,%r9d
  xor    $0x1,%r9d
  test   %r11d,%r11d
  cmovne %eax,%r8d
  cmovne %r10,%rdi
  jmp    L51
  nopw   0x0(%rax,%rax,1)
L75:
  movzbl 0x1(%rsi),%esi
  and    $0xf,%eax
  xor    %r10d,%r10d
  shl    $0x6,%eax
  mov    %esi,%r9d
  and    $0xffffffc0,%r9d
  cmp    $0x80,%r9b
  sete   %r10b
  and    $0x3f,%esi
  add    %rdi,%r10
  or     %eax,%esi
  jmp    L68
  xchg   %ax,%ax
L43:
  movzbl 0x1(%rsi),%esi
  and    $0x1f,%eax
  xor    %r11d,%r11d
  shl    $0x6,%eax
  mov    %esi,%r9d
  and    $0xffffffc0,%r9d
  cmp    $0x80,%r9b
  sete   %r10b
  sete   %r11b
  and    $0x3f,%esi
  movzbl %r10b,%r10d
  or     %esi,%eax
  add    %rdi,%r10
  jmp    L2
```

assistant: ```c
unsigned int vtkParse_DecodeUtf8(const char **cpp, int *error_flag) {
  const unsigned char *cp = (const unsigned char *)(*cpp);
  unsigned int code = *cp++;
  unsigned int s = 0;
  int good = 1;
  if ((code & 0x80) != 0) {
    good = 0;
    if ((code & 0xE0) == 0xC0) {
      code &= 0x1F;
      code <<= 6;
      s = *cp;
      good = ((s & 0xC0) == 0x80);
      cp += good;
      code |= (s & 0x3F);
    } else if ((code & 0xF0) == 0xE0) {
      code &= 0x0F;
      code <<= 6;
      s = *cp;
      good = ((s & 0xC0) == 0x80);
      cp += good;
      code |= (s & 0x3F);
      code <<= 6;
      s = *cp;
      good = ((s & 0xC0) == 0x80);
      cp += good;
      code |= (s & 0x3F);
    } else if ((code & 0xF8) == 0xF0) {
      code &= 0x07;
      code <<= 6;
      s = *cp;
      good = ((s & 0xC0) == 0x80);
      cp += good;
      code |= (s & 0x3F);
      code <<= 6;
      s = *cp;
      good = ((s & 0xC0) == 0x80);
      cp += good;
      code |= (s & 0x3F);
      code <<= 6;
      s = *cp;
      good = ((s & 0xC0) == 0x80);
      cp += good;
      code |= (s & 0x3F);
    }
    if (!good) {
      cp = (const unsigned char *)(*cpp);
      code = *cp++;
    }
  }
  if (error_flag) {
    *error_flag = !good;
  }
  *cpp = (const char *)(cp);
  return code;
}
```