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

```asm
<_fnmatch_class>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L76
  movl   $0x1,-0x8(%rbp)
  addq   $0x1,-0x18(%rbp)
L76:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  jne    L130
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L102
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L102
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jl     L3
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jg     L3
  movl   $0x1,-0xc(%rbp)
L3:
  addq   $0x1,-0x18(%rbp)
  jmp    L82
L102:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  jne    L82
  movl   $0x1,-0xc(%rbp)
L82:
  addq   $0x1,-0x18(%rbp)
L130:
  movl   $0x0,-0x4(%rbp)
  jmp    L149
L51:
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L122
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L122
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x4(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jl     L25
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jg     L25
  movl   $0x1,-0xc(%rbp)
L25:
  addl   $0x1,-0x4(%rbp)
  jmp    L20
L122:
  mov    -0x4(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L20
  movl   $0x1,-0xc(%rbp)
L20:
  addl   $0x1,-0x4(%rbp)
L149:
  mov    -0x4(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  jne    L51
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L177
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rsi
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %rcx,%rdi
  call   <fnmatch@plt>
  test   %eax,%eax
  je     L106
L177:
  mov    -0x8(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  je     L106
  mov    $0x1,%eax
  jmp    L131
L106:
  mov    $0x0,%eax
L131:
  leave
  ret
```

assistant: ```c
int _fnmatch_class(char const *pattern, char const *string, int flags) {
  int ret = 0;
  int neg = 0;
  unsigned int i;
  if (pattern[0] == '!') {
    neg = 1;
    pattern++;
  }
  if (*pattern == ']') {
    if (pattern[1] == '-' && pattern[2] != ']') {
      if (*string >= pattern[0] && *string <= pattern[2])
        ret = 1;
      pattern++;
    } else if (string[0] == ']')
      ret = 1;
    pattern++;
  }
  for (i = 0; pattern[i] != ']'; i++) {
    if (pattern[1] == '-' && pattern[i + 1] != ']') {
      if (*string >= pattern[i - 1] && string[0] <= pattern[i + 1])
        ret = 1;
      i++;
    } else if (pattern[i] == *string)
      ret = 1;
  }
  return ((string[0] != '\0' ? fnmatch(&pattern[i + 1], &string[1], flags) : 1) && neg ^ ret) ? 1 : 0;
}
```