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

```asm
<get_utf8_value>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  movl   $0x0,-0x1c(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x80,%eax
  test   %eax,%eax
  jne    L107
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  jmp    L43
L107:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xe0,%eax
  cmp    $0xc0,%eax
  jne    L128
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x1f,%eax
  mov    %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <get_val_utf82uni@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L43
L128:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xf0,%eax
  cmp    $0xe0,%eax
  jne    L177
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xf,%eax
  mov    %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <get_val_utf82uni@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L43
L177:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xf8,%eax
  cmp    $0xf0,%eax
  jne    L66
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x7,%eax
  mov    %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <get_val_utf82uni@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L43
L66:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xfc,%eax
  cmp    $0xf8,%eax
  jne    L39
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3,%eax
  mov    %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <get_val_utf82uni@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L43
L39:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xfe,%eax
  cmp    $0xfc,%eax
  jne    L159
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x1,%eax
  mov    %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  shll   $0x6,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0x3f,%eax
  or     %eax,-0x1c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <get_val_utf82uni@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L43
L159:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L163
  jmp    L37
L140:
  addq   $0x4,-0x18(%rbp)
L37:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  je     L140
  jmp    L43
L65:
  addq   $0x4,-0x18(%rbp)
L163:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  and    $0xfe,%eax
  cmp    $0xfc,%eax
  jg     L65
L43:
  cmpq   $0x0,-0x30(%rbp)
  je     L91
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
L91:
  mov    -0x18(%rbp),%rax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

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