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

```asm
<verify_utf8_sequence>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  movl   $0x0,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <num_bytes_in_utf8_sequence@plt>
  mov    -0x20(%rbp),%rdx
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x1,%eax
  jne    L137
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L72
L137:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x2,%eax
  jne    L213
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L213
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x1f,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L72
L213:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x3,%eax
  jne    L251
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L251
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L251
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L72
L251:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x4,%eax
  jne    L41
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L41
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L41
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  jne    L41
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x7,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x3f,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L72
L41:
  mov    $0x0,%eax
  jmp    L181
L72:
  cmpl   $0x7f,-0x4(%rbp)
  ja     L267
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x1,%eax
  jg     L99
L267:
  cmpl   $0x7ff,-0x4(%rbp)
  ja     L227
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x2,%eax
  jg     L99
L227:
  cmpl   $0xffff,-0x4(%rbp)
  ja     L29
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x3,%eax
  jle    L29
L99:
  mov    $0x0,%eax
  jmp    L181
L29:
  cmpl   $0x10ffff,-0x4(%rbp)
  jbe    L134
  mov    $0x0,%eax
  jmp    L181
L134:
  cmpl   $0xd7ff,-0x4(%rbp)
  jbe    L21
  cmpl   $0xdfff,-0x4(%rbp)
  ja     L21
  mov    $0x0,%eax
  jmp    L181
L21:
  mov    $0x1,%eax
L181:
  leave
  ret
```

assistant: ```c
int verify_utf8_sequence(const unsigned char *string, int *len) {
  unsigned int cp = 0;
  *len = num_bytes_in_utf8_sequence(string[0]);
  if (*len == 1) {
    cp = string[0];
  } else if (*len == 2 && (((unsigned char)(string[1]) & 0xC0) == 0x80)) {
    cp = string[0] & 0x1F;
    cp = (cp << 6) | (string[1] & 0x3F);
  } else if (*len == 3 && (((unsigned char)(string[1]) & 0xC0) == 0x80) && (((unsigned char)(string[2]) & 0xC0) == 0x80)) {
    cp = ((unsigned char)string[0]) & 0xF;
    cp = (cp << 6) | (string[1] & 0x3F);
    cp = (cp << 6) | (string[2] & 0x3F);
  } else if (*len == 4 && (((unsigned char)(string[1]) & 0xC0) == 0x80) && (((unsigned char)(string[2]) & 0xC0) == 0x80) && (((unsigned char)(string[3]) & 0xC0) == 0x80)) {
    cp = string[0] & 0x7;
    cp = (cp << 6) | (string[1] & 0x3F);
    cp = (cp << 6) | (string[2] & 0x3F);
    cp = (cp << 6) | (string[3] & 0x3F);
  } else {
    return 0;
  }
  if ((cp < 0x80 && *len > 1) || (cp < 0x800 && *len > 2) || (cp < 0x10000 && *len > 3)) {
    return 0;
  }
  if (cp > 0x10FFFF) {
    return 0;
  }
  if (cp >= 0xD800 && cp <= 0xDFFF) {
    return 0;
  }
  return 1;
}
```