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

```asm
<IsUTF8Text>:
  endbr64
  mov    %rdi,%rdx
  test   %esi,%esi
  jle    L389
  xor    %eax,%eax
L359:
  movslq %eax,%r8
  mov    $0x1,%edi
  movzbl (%rdx,%r8,1),%ecx
  test   %cl,%cl
  js     L54
L311:
  add    %edi,%eax
  cmp    %eax,%esi
  jg     L359
L389:
  mov    $0x1,%eax
  ret
  nopw   0x0(%rax,%rax,1)
L54:
  mov    %ecx,%r9d
  movsbl %cl,%edi
  and    $0xe0,%r9d
  cmp    $0xc0,%r9d
  je     L242
  mov    %edi,%r9d
  and    $0xf0,%r9d
  cmp    $0xe0,%r9d
  je     L298
  mov    %edi,%r9d
  and    $0xf8,%r9d
  cmp    $0xf0,%r9d
  je     L58
  mov    %edi,%r9d
  and    $0xfc,%r9d
  cmp    $0xf8,%r9d
  je     L344
  and    $0xfe,%edi
  cmp    $0xfc,%edi
  jne    L268
  lea    0x6(%rax),%edi
  cmp    %esi,%edi
  jg     L268
  and    $0x1,%ecx
  jne    L357
  testb  $0x3e,0x1(%rdx,%r8,1)
  je     L268
L357:
  lea    0x1(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  mov    $0x6,%edi
L280:
  lea    0x2(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  lea    0x3(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  cmp    $0x4,%edi
  je     L311
  lea    0x4(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  cmp    $0x6,%edi
  jne    L157
  lea    0x5(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  je     L311
L268:
  xor    %eax,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L242:
  lea    0x2(%rax),%edi
  cmp    %esi,%edi
  jg     L268
  and    $0x1e,%ecx
  je     L268
  lea    0x1(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  mov    $0x2,%edi
  jmp    L311
L298:
  lea    0x3(%rax),%edi
  cmp    %esi,%edi
  jg     L268
  and    $0xf,%ecx
  jne    L108
  testb  $0x20,0x1(%rdx,%r8,1)
  je     L268
L108:
  lea    0x1(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  lea    0x2(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  mov    $0x3,%edi
  jmp    L311
  nopl   0x0(%rax)
L344:
  lea    0x5(%rax),%edi
  cmp    %esi,%edi
  jg     L268
  and    $0x3,%ecx
  je     L312
L378:
  lea    0x1(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  mov    $0x5,%edi
  jmp    L280
L58:
  lea    0x4(%rax),%edi
  cmp    %esi,%edi
  jg     L268
  and    $0x7,%ecx
  jne    L371
  testb  $0x30,0x1(%rdx,%r8,1)
  je     L268
L371:
  lea    0x1(%rax),%ecx
  movslq %ecx,%rcx
  movsbl (%rdx,%rcx,1),%ecx
  and    $0xc0,%ecx
  cmp    $0x80,%ecx
  jne    L268
  mov    $0x4,%edi
  jmp    L280
L312:
  testb  $0x38,0x1(%rdx,%r8,1)
  jne    L378
  jmp    L268
L157:
  mov    $0x5,%edi
  jmp    L311
```

assistant: ```c
int IsUTF8Text(const char *utf8, int len) {
  int i;
  int j;
  int clen;
  for (i = 0; i < len; i += clen) {
    if ((0 == ((utf8[i]) & 0x80))) {
      clen = 1;
    } else if ((0xC0 == ((utf8[i]) & 0xE0))) {
      clen = 2;
      if ((i + clen) > len)
        return 0;
      if (0 == (utf8[i] & 0x1E))
        return 0;
    } else if ((0xE0 == ((utf8[i]) & 0xF0))) {
      clen = 3;
      if ((i + clen) > len)
        return 0;
      if ((0xED == utf8[i]) && (0xA0 == (utf8[i + 1] & 0xA0)))
        return 0;
      if ((0 == (utf8[i] & 0x0F)) && (0 == (utf8[i + 1] & 0x20)))
        return 0;
    } else if ((0xF0 == ((utf8[i]) & 0xF8))) {
      clen = 4;
      if ((i + clen) > len)
        return 0;
      if ((0 == (utf8[i] & 0x07)) && (0 == (utf8[i + 1] & 0x30)))
        return 0;
    } else if ((0xF8 == ((utf8[i]) & 0xFC))) {
      clen = 5;
      if ((i + clen) > len)
        return 0;
      if ((0 == (utf8[i] & 0x03)) && (0 == (utf8[i + 1] & 0x38)))
        return 0;
    } else if ((0xFC == ((utf8[i]) & 0xFE))) {
      clen = 6;
      if ((i + clen) > len)
        return 0;
      if ((0 == (utf8[i] & 0x01)) && (0 == (utf8[i + 1] & 0x3E)))
        return 0;
    } else {
      return 0;
    }
    for (j = 1; j < clen; j++) {
      if (!(0x80 == ((utf8[i + j]) & 0xC0)))
        return 0;
    }
  }
  return 1;
}
```