user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<is_utf_8>:
  endbr64
  push   %rbx
  mov    %rdi,%rbx
  jmp    L354
L95:
  mov    %eax,%edx
  sar    $0x5,%edx
  cmp    $0x6,%edx
  je     L267
  mov    %eax,%edx
  sar    $0x4,%edx
  cmp    $0xe,%edx
  je     L335
  mov    %eax,%edx
  sar    $0x3,%edx
  cmp    $0x1e,%edx
  jne    L402
  cmp    $0xf3,%eax
  jle    L256
  cmp    $0xf4,%eax
  jne    L90
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L209
  cmp    $0x8f,%eax
  jg     L209
  sar    $0x6,%eax
  cmp    $0x2,%eax
  jne    L224
L375:
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L96
  sar    $0x6,%eax
  cmp    $0x2,%eax
  jne    L266
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L43
  sar    $0x6,%eax
  cmp    $0x2,%eax
  jne    L170
L354:
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L214
  cmp    $0x7e,%eax
  jg     L95
  cmp    $0x1f,%eax
  jg     L354
  sub    $0x9,%eax
  cmp    $0x4,%eax
  jbe    L354
  mov    $0x0,%eax
  jmp    L318
L267:
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L33
  sar    $0x6,%eax
  cmp    $0x2,%eax
  je     L354
  mov    $0x0,%eax
  jmp    L318
L335:
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L8
  sar    $0x6,%eax
  cmp    $0x2,%eax
  jne    L112
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L148
  sar    $0x6,%eax
  cmp    $0x2,%eax
  je     L354
  mov    $0x0,%eax
  jmp    L318
L256:
  mov    %rbx,%rdi
  call   <fgetc@plt>
  mov    D5(%rip),%rdx
  cmp    %eax,(%rdx)
  je     L350
  sar    $0x6,%eax
  cmp    $0x2,%eax
  je     L375
  mov    $0x0,%eax
  jmp    L318
L170:
  mov    $0x0,%eax
  jmp    L318
L214:
  mov    $0x1,%eax
L318:
  pop    %rbx
  ret
L33:
  mov    $0x0,%eax
  jmp    L318
L8:
  mov    $0x0,%eax
  jmp    L318
L402:
  mov    $0x0,%eax
  jmp    L318
L350:
  mov    $0x0,%eax
  jmp    L318
L90:
  mov    $0x0,%eax
  jmp    L318
L209:
  mov    $0x0,%eax
  jmp    L318
L112:
  mov    $0x0,%eax
  jmp    L318
L148:
  mov    $0x0,%eax
  jmp    L318
L224:
  mov    $0x0,%eax
  jmp    L318
L96:
  mov    $0x0,%eax
  jmp    L318
L266:
  mov    $0x0,%eax
  jmp    L318
L43:
  mov    $0x0,%eax
  jmp    L318
```

assistant: ```c
int is_utf_8(FILE *fp) {
  int byte;
utf8_null:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_finished;
  if (byte < 0x7F) {
    if (byte >= 0x20)
      goto utf8_null;
    if (byte >= 0x09 && byte <= 0x0D)
      goto utf8_null;
    goto utf8_error;
  }
  if (byte >> 5 == 0x06)
    goto utf8_2b_1;
  if (byte >> 4 == 0x0E)
    goto utf8_3b_1;
  if (byte >> 3 == 0x1E) {
    if (byte < 0xF4)
      goto utf8_4b_1;
    if (byte == 0xF4)
      goto utf8_4b_1_max;
  }
  goto utf8_error;
utf8_2b_1:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_null;
  goto utf8_error;
utf8_3b_1:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_3b_2;
  goto utf8_error;
utf8_3b_2:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_null;
  goto utf8_error;
utf8_4b_1:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_4b_2;
  goto utf8_error;
utf8_4b_1_max:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >= 0x90)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_4b_2;
  goto utf8_error;
utf8_4b_2:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_4b_3;
  goto utf8_error;
utf8_4b_3:
  byte = fgetc(fp);
  if (byte == EOF)
    goto utf8_error;
  if (byte >> 6 == 0x02)
    goto utf8_null;
  goto utf8_error;
utf8_error:
  return 0;
utf8_finished:
  return 1;
}
```