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

```asm
<glob_match>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rsi,%r10
  mov    %edx,%r11d
  movzbl (%rdi),%edx
  test   %dl,%dl
  je     L191
  mov    %rdi,%rax
  lea    0x1(%rdi),%rcx
  mov    %rsi,%r8
  lea    0x1(%rsi),%r9
  jmp    L203
L16:
  cmp    $0x5c,%dl
  jne    L311
  lea    0x2(%rax),%rdx
  mov    %r9,%rbx
  movzbl (%r8),%edi
  cmp    %dil,0x1(%rax)
  jne    L303
  mov    %rdx,%rax
L270:
  lea    0x1(%rax),%rcx
  movzbl (%rax),%edx
  add    $0x1,%r8
  add    $0x1,%r9
  test   %dl,%dl
  je     L175
L203:
  mov    %r8,%rsi
  cmp    $0x5b,%dl
  je     L112
  jg     L16
  cmp    $0x2a,%dl
  je     L358
  cmp    $0x3f,%dl
  jne    L311
  movzbl (%r8),%eax
  test   %al,%al
  je     L496
  test   %r11d,%r11d
  setne  %dil
  cmp    %r8,%r10
  sete   %dl
  test   %dl,%dil
  je     L317
  cmp    $0x2e,%al
  je     L68
L317:
  mov    %r9,%rbx
  mov    %rcx,%rax
  jmp    L270
L358:
  test   %r11d,%r11d
  je     L86
  cmp    %r8,%r10
  jne    L86
  mov    $0x0,%eax
  cmpb   $0x2e,(%r8)
  je     L63
L86:
  mov    %rcx,%rdi
  mov    $0x0,%eax
  call   <glob_match_after_star@plt>
L63:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
L112:
  mov    %r9,%rbx
  movzbl (%r8),%edi
  test   %dil,%dil
  je     L400
  movzbl 0x1(%rax),%esi
  cmp    $0x21,%sil
  sete   %dl
  cmp    $0x5e,%sil
  sete   %sil
  add    $0x2,%rax
  or     %sil,%dl
  mov    %edx,%ebp
  cmovne %rax,%rcx
  lea    0x1(%rcx),%rax
  movzbl (%rcx),%edx
  jmp    L189
L290:
  movzbl (%rax),%ecx
  lea    0x1(%rax),%rax
  jmp    L219
L422:
  movzbl 0x1(%rax),%esi
  lea    0x2(%rax),%rdx
  cmp    $0x5c,%sil
  je     L1
L415:
  test   %sil,%sil
  je     L367
  lea    0x1(%rdx),%rax
  movzbl (%rdx),%edx
  jmp    L388
L1:
  lea    0x3(%rax),%rdx
  movzbl 0x2(%rax),%esi
  jmp    L415
L78:
  cmp    $0x5d,%dl
  je     L346
L189:
  cmp    $0x5c,%dl
  je     L290
  test   %dl,%dl
  je     L124
  mov    %edx,%ecx
L219:
  movzbl (%rax),%edx
  cmp    $0x2d,%dl
  je     L422
  add    $0x1,%rax
  mov    %ecx,%esi
L388:
  cmp    %dil,%cl
  jg     L78
  cmp    %dil,%sil
  jl     L78
  cmp    $0x5d,%dl
  je     L188
  test   %dl,%dl
  jne    L193
  mov    $0x0,%eax
  jmp    L63
L346:
  test   %bpl,%bpl
  jne    L270
  mov    $0x0,%eax
  jmp    L63
L495:
  add    $0x2,%rax
L193:
  movzbl (%rax),%edx
  test   %dl,%dl
  je     L449
  cmp    $0x5c,%dl
  je     L495
  add    $0x1,%rax
  cmp    $0x5d,%dl
  jne    L193
L188:
  test   %bpl,%bpl
  je     L270
  mov    $0x0,%eax
  jmp    L63
L311:
  mov    %r9,%rbx
  cmp    %dl,(%rsi)
  jne    L360
  mov    %rcx,%rax
  jmp    L270
L191:
  mov    %rsi,%rbx
L175:
  cmpb   $0x0,(%rbx)
  sete   %al
  movzbl %al,%eax
  jmp    L63
L496:
  mov    $0x0,%eax
  jmp    L63
L68:
  mov    $0x0,%eax
  jmp    L63
L303:
  mov    $0x0,%eax
  jmp    L63
L400:
  mov    $0x0,%eax
  jmp    L63
L124:
  mov    $0x0,%eax
  jmp    L63
L367:
  mov    $0x0,%eax
  jmp    L63
L449:
  mov    $0x0,%eax
  jmp    L63
L360:
  mov    $0x0,%eax
  jmp    L63
```

assistant: ```c
int glob_match(pattern, text, dot_special)
char *pattern, *text;
int dot_special;
{
  register char *p = pattern, *t = text;
  register char c;
  while ((c = *p++) != '\0')
    switch (c) {
    case '?':
      if (*t == '\0' || (dot_special && t == text && *t == '.'))
        return 0;
      else
        ++t;
      break;
    case '\\':
      if (*p++ != *t++)
        return 0;
      break;
    case '*':
      if (dot_special && t == text && *t == '.')
        return 0;
      return glob_match_after_star(p, t);
    case '[': {
      register char c1 = *t++;
      int invert;
      if (!c1)
        return (0);
      invert = ((*p == '!') || (*p == '^'));
      if (invert)
        p++;
      c = *p++;
      while (1) {
        register char cstart = c, cend = c;
        if (c == '\\') {
          cstart = *p++;
          cend = cstart;
        }
        if (c == '\0')
          return 0;
        c = *p++;
        if (c == '-') {
          cend = *p++;
          if (cend == '\\')
            cend = *p++;
          if (cend == '\0')
            return 0;
          c = *p++;
        }
        if (c1 >= cstart && c1 <= cend)
          goto match;
        if (c == ']')
          break;
      }
      if (!invert)
        return 0;
      break;
    match:
      while (c != ']') {
        if (c == '\0')
          return 0;
        c = *p++;
        if (c == '\0')
          return 0;
        else if (c == '\\')
          ++p;
      }
      if (invert)
        return 0;
      break;
    }
    default:
      if (c != *t++)
        return 0;
    }
  return *t == '\0';
}
```