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

```asm
<amatch>:
  endbr64
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x8,%rsp
  movsbl (%rsi),%eax
  test   %al,%al
  je     L243
L423:
  movsbl 0x0(%rbp),%edx
  test   %dl,%dl
  jne    L121
  cmp    $0x2a,%al
  jne    L6
  lea    0x1(%rsi),%rbx
L358:
  movzbl (%rbx),%ecx
  cmp    $0x2a,%cl
  jne    L36
  nopl   0x0(%rax)
L202:
  movzbl 0x1(%rbx),%ecx
  add    $0x1,%rbx
  cmp    $0x2a,%cl
  je     L202
L36:
  mov    $0x1,%eax
  test   %cl,%cl
  je     L134
  lea    -0x5b(%rcx),%eax
  cmp    $0x1,%al
  jbe    L339
  cmp    $0x3f,%cl
  jne    L232
L339:
  test   %dl,%dl
  je     L6
  cs nopw 0x0(%rax,%rax,1)
L449:
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <amatch>
  test   %eax,%eax
  jne    L240
  add    $0x1,%rbp
  cmpb   $0x0,0x0(%rbp)
  jne    L449
L134:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L121:
  lea    0x1(%rsi),%rbx
  cmp    $0x3f,%al
  je     L513
  jle    L510
  cmp    $0x5b,%al
  je     L98
  cmp    $0x5c,%al
  jne    L319
  movsbl 0x1(%rsi),%eax
  add    $0x2,%rsi
  test   %al,%al
  je     L179
L485:
  cmp    %eax,%edx
  jne    L6
L247:
  movsbl (%rsi),%eax
  add    $0x1,%rbp
  test   %al,%al
  jne    L423
L243:
  xor    %eax,%eax
  cmpb   $0x0,0x0(%rbp)
  sete   %al
  jmp    L134
L510:
  cmp    $0x2a,%al
  je     L358
L319:
  mov    %rbx,%rsi
  jmp    L485
  nopl   (%rax)
L98:
  movzbl 0x1(%rsi),%edi
  lea    0x2(%rsi),%rax
  cmp    $0x5e,%dil
  je     L530
  test   %dil,%dil
  je     L6
  xor    %r8d,%r8d
  jmp    L520
L183:
  cmp    %dil,%dl
  je     L526
  cmp    $0x5d,%cl
  je     L187
  cmp    %cl,%dl
  je     L526
  movzbl (%rax),%edi
  lea    0x1(%rax),%rcx
  test   %dil,%dil
  je     L125
L380:
  mov    %rax,%rbx
  mov    %rcx,%rax
L520:
  movzbl 0x1(%rbx),%ecx
  test   %cl,%cl
  je     L6
L64:
  cmp    $0x2d,%cl
  jne    L183
  movzbl 0x2(%rbx),%esi
  lea    0x2(%rbx),%rax
  test   %sil,%sil
  je     L6
  cmp    $0x5d,%sil
  je     L549
  cmp    %dil,%dl
  je     L526
  cmp    %sil,%dl
  je     L526
  cmp    %dil,%dl
  jle    L159
  cmp    %sil,%dl
  jl     L526
L159:
  lea    0x3(%rbx),%rcx
  mov    %esi,%edi
  jmp    L380
  nopl   0x0(%rax)
L513:
  mov    %rbx,%rsi
  jmp    L247
L179:
  mov    %rbx,%rsi
  mov    $0x5c,%eax
  jmp    L485
  nopl   (%rax)
L530:
  movzbl 0x2(%rsi),%edi
  lea    0x3(%rsi),%rcx
  test   %dil,%dil
  je     L467
  mov    %rax,%rbx
  mov    %rcx,%rax
  mov    $0x1,%r8d
  movzbl 0x1(%rbx),%ecx
  test   %cl,%cl
  jne    L64
  nopl   (%rax)
L6:
  xor    %eax,%eax
L401:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L526:
  mov    $0x1,%edx
L525:
  cmp    %r8d,%edx
  jne    L486
  jmp    L6
  nopl   0x0(%rax)
L445:
  add    $0x1,%rax
L486:
  movzbl (%rax),%edx
  test   %dl,%dl
  je     L253
  cmp    $0x5d,%dl
  jne    L445
L253:
  lea    0x1(%rax),%rsi
  test   %dl,%dl
  jne    L247
  xor    %eax,%eax
  jmp    L401
  nopl   0x0(%rax,%rax,1)
L232:
  cmp    %cl,%dl
  je     L339
  test   %dl,%dl
  jne    L198
  jmp    L6
  xchg   %ax,%ax
L426:
  cmp    %cl,%dl
  je     L339
L198:
  movzbl 0x1(%rbp),%edx
  add    $0x1,%rbp
  test   %dl,%dl
  jne    L426
  xor    %eax,%eax
  jmp    L401
  nopl   0x0(%rax,%rax,1)
L125:
  mov    %rcx,%rax
L187:
  xor    %edx,%edx
  jmp    L525
  nopw   0x0(%rax,%rax,1)
L240:
  mov    $0x1,%eax
  jmp    L134
L549:
  cmp    %dil,%dl
  setge  %dl
  movzbl %dl,%edx
  jmp    L525
L467:
  mov    %rcx,%rax
  jmp    L486
```

assistant: ```c
int amatch(char *str, char *p) {
  int negate;
  int match;
  int c;
  while (*p) {
    if (!*str && *p != '*')
      return 0;
    switch (c = *p++) {
    case '*':
      while (*p == '*')
        p++;
      if (!*p)
        return 1;
      if (*p != '?' && *p != '[' && *p != '\\')
        while (*str && *p != *str)
          str++;
      while (*str) {
        if (amatch(str, p))
          return 1;
        str++;
      }
      return 0;
    case '?':
      if (*str)
        break;
      return 0;
    case '[':
      if (*p != '^')
        negate = 0;
      else {
        negate = 1;
        p++;
      }
      match = 0;
      while (!match && (c = *p++)) {
        if (!*p)
          return 0;
        if (*p == '-') {
          if (!*++p)
            return 0;
          if (*p != ']') {
            if (*str == c || *str == *p || (*str > c && *str < *p))
              match = 1;
          } else {
            if (*str >= c)
              match = 1;
            break;
          }
        } else {
          if (c == *str)
            match = 1;
          if (*p != ']') {
            if (*p == *str)
              match = 1;
          } else
            break;
        }
      }
      if (negate == match)
        return 0;
      while (*p && *p != ']')
        p++;
      if (!*p++)
        return 0;
      break;
    case '\\':
      if (*p)
        c = *p++;
    default:
      if (c != *str)
        return 0;
      break;
    }
    str++;
  }
  return !*str;
}
```