user: 下面的汇编指令对应的C源代码是什么：

```asm
<DoMatch>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L274
  movsbl (%r14),%edi
  mov    %rsi,%rbx
  mov    $0x1,%ebp
  cmp    $0x2a,%al
  je     L155
L288:
  test   %dil,%dil
  je     L63
L155:
  cmp    $0x5b,%al
  je     L192
L69:
  jg     L208
  cmp    $0x2a,%al
  je     L15
  cmp    $0x3f,%al
  jne    L298
L103:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%r14
  lea    0x1(%rbx),%rdx
  test   %al,%al
  je     L274
  movsbl (%r14),%edi
  mov    %rdx,%rbx
  cmp    $0x2a,%al
  jne    L288
  cmp    $0x5b,%al
  jne    L69
L192:
  movzbl 0x1(%rbx),%eax
  xor    %edx,%edx
  cmp    $0x5e,%al
  sete   %dl
  mov    %edx,0xc(%rsp)
  jne    L41
  movzbl 0x2(%rbx),%eax
  add    $0x1,%rbx
L41:
  cmp    $0x5d,%al
  je     L12
  xor    %r12d,%r12d
  cmp    $0x2d,%al
  je     L12
L57:
  movsbl (%rbx),%ecx
  lea    0x1(%rbx),%r15
  cmp    $0x5d,%al
  jne    L199
  jmp    L267
  nop
L150:
  movzbl 0x2(%rbx),%eax
  cmp    $0x5d,%al
  je     L247
  add    $0x2,%rbx
  cmp    %dil,%al
  jl     L122
  cmp    %ecx,%edi
  cmovge %ebp,%r12d
L122:
  movsbl %al,%ecx
  movzbl 0x1(%rbx),%eax
  lea    0x1(%rbx),%r15
  cmp    $0x5d,%al
  je     L267
L199:
  test   %al,%al
  je     L267
  movsbl (%r14),%edi
  cmp    $0x2d,%al
  je     L150
L247:
  call   <toupper@plt>
  movsbl 0x1(%rbx),%edi
  mov    %r15,%rbx
  mov    %eax,%r13d
  call   <toupper@plt>
  mov    %eax,%r8d
  movzbl (%r15),%eax
  lea    0x1(%rbx),%r15
  cmp    %r8d,%r13d
  movsbl %al,%ecx
  movzbl 0x1(%rbx),%eax
  cmove  %ebp,%r12d
  cmp    $0x5d,%al
  jne    L199
L267:
  cmp    %r12d,0xc(%rsp)
  je     L73
  mov    %r15,%rbx
  jmp    L103
  nopw   0x0(%rax,%rax,1)
L208:
  cmp    $0x5c,%al
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbx
L298:
  call   <toupper@plt>
  movsbl (%rbx),%edi
  mov    %eax,%r12d
  call   <toupper@plt>
  cmp    %eax,%r12d
  je     L103
L73:
  xor    %eax,%eax
L220:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L15:
  movzbl 0x1(%rbx),%edx
  add    $0x1,%rbx
  cmp    $0x2a,%dl
  je     L15
  mov    $0x1,%eax
  test   %dl,%dl
  je     L220
  cmpb   $0x0,(%r14)
  je     L63
L11:
  mov    %rbx,%rsi
  mov    %r14,%rdi
  lea    0x1(%r14),%rbp
  call   <DoMatch>
  test   %eax,%eax
  jne    L220
  mov    %rbp,%r14
  cmpb   $0x0,(%r14)
  jne    L11
L63:
  add    $0x18,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L12:
  movsbl %al,%edi
  xor    %r12d,%r12d
  lea    0x1(%rbx),%r13
  call   <toupper@plt>
  movsbl (%r14),%edi
  mov    %eax,%r15d
  call   <toupper@plt>
  cmp    %eax,%r15d
  movzbl 0x2(%rbx),%eax
  mov    %r13,%rbx
  sete   %r12b
  jmp    L57
  xchg   %ax,%ax
L274:
  xor    %eax,%eax
  cmpb   $0x0,(%r14)
  sete   %al
  jmp    L220
```

assistant: ```c
int DoMatch(char *text, char *p) {
  register int last;
  register int matched;
  register int reverse;
  for (; *p; text++, p++) {
    if (*text == '\0' && *p != '*')
      return -1;
    switch (*p) {
    case '\\':
      p++;
    default:
      if (toupper(*text) != toupper(*p))
        return 0;
      continue;
    case '?':
      continue;
    case '*':
      while (*++p == '*')
        continue;
      if (*p == '\0')
        return 1;
      while (*text)
        if ((matched = DoMatch(text++, p)) != 0)
          return matched;
      return -1;
    case '[':
      reverse = p[1] == '^' ? 1 : 0;
      if (reverse)
        p++;
      matched = 0;
      if (p[1] == ']' || p[1] == '-')
        if (toupper(*++p) == toupper(*text))
          matched = 1;
      for (last = *p; *++p && *p != ']'; last = *p)
        if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : toupper(*text) == toupper(*p))
          matched = 1;
      if (matched == reverse)
        return 0;
      continue;
    }
  }
  return *text == '\0';
}
```