user: 请将以下的汇编代码转换成C语言代码：

```asm
<vtkParse_DecodeUtf8>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  movl   $0x0,-0xc(%rbp)
  movl   $0x1,-0x10(%rbp)
  mov    -0x14(%rbp),%eax
  and    $0x80,%eax
  test   %eax,%eax
  je     L56
  movl   $0x0,-0x10(%rbp)
  mov    -0x14(%rbp),%eax
  and    $0xe0,%eax
  cmp    $0xc0,%eax
  jne    L38
  andl   $0x1f,-0x14(%rbp)
  shll   $0x6,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  or     %eax,-0x14(%rbp)
  jmp    L9
L38:
  mov    -0x14(%rbp),%eax
  and    $0xf0,%eax
  cmp    $0xe0,%eax
  jne    L53
  andl   $0xf,-0x14(%rbp)
  shll   $0x6,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  or     %eax,-0x14(%rbp)
  shll   $0x6,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  or     %eax,-0x14(%rbp)
  jmp    L9
L53:
  mov    -0x14(%rbp),%eax
  and    $0xf8,%eax
  cmp    $0xf0,%eax
  jne    L9
  andl   $0x7,-0x14(%rbp)
  shll   $0x6,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  or     %eax,-0x14(%rbp)
  shll   $0x6,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  or     %eax,-0x14(%rbp)
  shll   $0x6,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  or     %eax,-0x14(%rbp)
L9:
  cmpl   $0x0,-0x10(%rbp)
  jne    L56
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
L56:
  cmpq   $0x0,-0x30(%rbp)
  je     L64
  cmpl   $0x0,-0x10(%rbp)
  sete   %al
  movzbl %al,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
L64:
  mov    -0x28(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x14(%rbp),%eax
  pop    %rbp
  ret
```

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;
}
```