user: 提供的汇编代码用C语言表示会是什么样子：

```asm
<get_utf8_value>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%r12
  test   %rdi,%rdi
  setne  %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    (%rbx),%ebp
  lea    0x4(%rbx),%r13
  test   $0x80,%bpl
  je     L29
  mov    %ebp,%eax
  and    $0xe0,%eax
  cmp    $0xc0,%eax
  je     L133
  mov    %ebp,%eax
  and    $0xf0,%eax
  cmp    $0xe0,%eax
  je     L109
  mov    %ebp,%eax
  and    $0xf8,%eax
  cmp    $0xf0,%eax
  je     L101
  mov    %ebp,%eax
  and    $0xfc,%eax
  cmp    $0xf8,%eax
  je     L34
  mov    %ebp,%eax
  and    $0xfe,%eax
  cmp    $0xfc,%eax
  je     L78
  and    $0xc0,%ebp
  cmp    $0x80,%ebp
  je     L6
  mov    %rbx,%r13
  mov    $0x0,%ebp
  cmp    $0xfc,%eax
  jle    L29
L76:
  add    $0x4,%rbx
  mov    (%rbx),%eax
  and    $0xfe,%eax
  cmp    $0xfc,%eax
  jg     L76
  mov    %rbx,%r13
  mov    $0x0,%ebp
  jmp    L29
L133:
  shl    $0x6,%ebp
  and    $0x7c0,%ebp
  mov    0x4(%rbx),%eax
  and    $0x3f,%eax
  or     %eax,%ebp
  lea    0x8(%rbx),%r13
  mov    %rbx,%rdi
  call   <get_val_utf82uni@plt>
  movslq %ebp,%rdx
  cmp    %rax,%rdx
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
L29:
  test   %r12,%r12
  je     L60
  movslq %ebp,%rbp
  mov    %rbp,(%r12)
L60:
  mov    %r13,%rax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L109:
  shl    $0x6,%ebp
  and    $0x3c0,%ebp
  mov    0x4(%rbx),%eax
  and    $0x3f,%eax
  or     %ebp,%eax
  shl    $0x6,%eax
  mov    0x8(%rbx),%ebp
  and    $0x3f,%ebp
  or     %eax,%ebp
  lea    0xc(%rbx),%r13
  mov    %rbx,%rdi
  call   <get_val_utf82uni@plt>
  movslq %ebp,%rdx
  cmp    %rax,%rdx
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  jmp    L29
L101:
  shl    $0x6,%ebp
  mov    %ebp,%eax
  and    $0x1c0,%eax
  mov    0x4(%rbx),%ebp
  and    $0x3f,%ebp
  or     %eax,%ebp
  shl    $0x6,%ebp
  mov    0x8(%rbx),%eax
  and    $0x3f,%eax
  or     %ebp,%eax
  shl    $0x6,%eax
  mov    0xc(%rbx),%ebp
  and    $0x3f,%ebp
  or     %eax,%ebp
  lea    0x10(%rbx),%r13
  mov    %rbx,%rdi
  call   <get_val_utf82uni@plt>
  movslq %ebp,%rdx
  cmp    %rax,%rdx
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  jmp    L29
L34:
  shl    $0x6,%ebp
  movzbl %bpl,%ebp
  mov    0x4(%rbx),%eax
  and    $0x3f,%eax
  or     %ebp,%eax
  shl    $0x6,%eax
  mov    0x8(%rbx),%edx
  and    $0x3f,%edx
  or     %eax,%edx
  shl    $0x6,%edx
  mov    0xc(%rbx),%eax
  and    $0x3f,%eax
  or     %edx,%eax
  shl    $0x6,%eax
  mov    0x10(%rbx),%ebp
  and    $0x3f,%ebp
  or     %eax,%ebp
  lea    0x14(%rbx),%r13
  mov    %rbx,%rdi
  call   <get_val_utf82uni@plt>
  movslq %ebp,%rdx
  cmp    %rax,%rdx
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  jmp    L29
L78:
  shl    $0x6,%ebp
  and    $0x40,%ebp
  mov    0x4(%rbx),%edx
  and    $0x3f,%edx
  or     %ebp,%edx
  shl    $0x6,%edx
  mov    0x8(%rbx),%eax
  and    $0x3f,%eax
  or     %edx,%eax
  shl    $0x6,%eax
  mov    0xc(%rbx),%edx
  and    $0x3f,%edx
  or     %eax,%edx
  shl    $0x6,%edx
  mov    0x10(%rbx),%eax
  and    $0x3f,%eax
  or     %edx,%eax
  shl    $0x6,%eax
  mov    0x14(%rbx),%ebp
  and    $0x3f,%ebp
  or     %eax,%ebp
  lea    0x18(%rbx),%r13
  mov    %rbx,%rdi
  call   <get_val_utf82uni@plt>
  movslq %ebp,%rdx
  cmp    %rax,%rdx
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  jmp    L29
L6:
  add    $0x4,%rbx
  mov    (%rbx),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  je     L6
  mov    %rbx,%r13
  mov    $0x0,%ebp
  jmp    L29
```

assistant: ```c
uint8_t *get_utf8_value(uint8_t *pstart, wchar_t *pval) {
  uint32_t val = 0;
  uint8_t *p = pstart;
  assert(NULL != pstart);
  if (0 == (0x80 & *p)) {
    val = (size_t)*p;
    p++;
  } else if (0xC0 == (0xE0 & *p)) {
    val = *p & 0x1F;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xE0 == (0xF0 & *p)) {
    val = *p & 0x0F;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xF0 == (0xF8 & *p)) {
    val = *p & 0x07;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xF8 == (0xFC & *p)) {
    val = *p & 0x03;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xFC == (0xFE & *p)) {
    val = *p & 0x01;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0x80 == (0xC0 & *p)) {
    for (; 0x80 == (0xC0 & *p); p++)
      ;
  } else {
    for (; ((0xFE & *p) > 0xFC); p++)
      ;
  }
  if (pval)
    *pval = val;
  return p;
}
```