user: 请从给定的汇编指令推导出C源代码:

```asm
<match>:
  endbr64
  jmp    L0
L81:
  lea    0x2(%rdi),%rdx
  mov    %ecx,%eax
L114:
  cmp    %al,(%rsi)
  jne    L127
  mov    %rdx,%rdi
L352:
  add    $0x1,%rsi
  cmpb   $0x0,-0x1(%rsi)
  je     L234
L0:
  lea    0x1(%rdi),%rdx
  movzbl (%rdi),%eax
  test   %al,%al
  je     L183
  cmp    $0x2a,%al
  je     L183
  cmp    $0x3f,%al
  je     L227
  cmp    $0x5c,%al
  jne    L114
  movzbl 0x1(%rdi),%ecx
  cmp    $0x3f,%cl
  je     L81
  cmp    $0x2a,%cl
  jne    L114
  jmp    L81
L227:
  mov    %rdx,%rdi
  jmp    L352
L183:
  test   %al,%al
  je     L268
L139:
  lea    0x1(%rdx),%rcx
  movzbl (%rdx),%eax
  test   %al,%al
  je     L213
L278:
  lea    -0x1(%rcx),%r8
  cmp    $0x3f,%al
  je     L27
  cmp    $0x5c,%al
  je     L119
  cmp    $0x2a,%al
  je     L275
L201:
  test   %al,%al
  je     L20
L175:
  add    $0x1,%rsi
  cmp    %al,-0x1(%rsi)
  je     L51
  cmpb   $0x0,(%rsi)
  jne    L175
  mov    $0x1,%eax
  ret
L268:
  movsbl (%rsi),%eax
  ret
L60:
  mov    %rsi,%rdi
  mov    %r8,%rdx
  jmp    L169
L27:
  cmpb   $0x0,(%rsi)
  jne    L207
  mov    $0x1,%eax
  ret
L207:
  add    $0x1,%rsi
L275:
  add    $0x1,%rcx
  movzbl -0x1(%rcx),%eax
  test   %al,%al
  jne    L278
  mov    $0x0,%eax
  ret
L119:
  movzbl (%rcx),%edx
  cmp    $0x3f,%dl
  je     L272
  cmp    $0x2a,%dl
  jne    L175
L272:
  lea    0x2(%r8),%rcx
  mov    %edx,%eax
  jmp    L201
L51:
  mov    %rsi,%rdi
  jmp    L216
L98:
  movzbl 0x1(%rcx),%r9d
  cmp    $0x3f,%r9b
  je     L343
  cmp    $0x2a,%r9b
  jne    L61
L343:
  lea    0x2(%rcx),%rdx
  mov    %r9d,%eax
  jmp    L61
L132:
  mov    %rdx,%rcx
L82:
  add    $0x1,%rdi
  cmpb   $0x0,-0x1(%rdi)
  je     L295
L216:
  lea    0x1(%rcx),%rdx
  movzbl (%rcx),%eax
  test   %al,%al
  je     L185
  cmp    $0x3f,%al
  je     L132
  cmp    $0x5c,%al
  je     L98
  cmp    $0x2a,%al
  je     L169
L61:
  cmp    %al,(%rdi)
  jne    L60
  mov    %rdx,%rcx
  jmp    L82
L185:
  cmpb   $0x0,(%rdi)
  je     L108
  mov    %rsi,%rdi
  mov    %r8,%rdx
L169:
  mov    %rdi,%rsi
  jmp    L139
L108:
  mov    $0x0,%eax
  ret
L127:
  mov    $0x1,%eax
  ret
L234:
  mov    $0x1,%eax
  ret
L213:
  mov    $0x0,%eax
  ret
L20:
  mov    $0x0,%eax
  ret
L295:
  mov    $0x1,%eax
  ret
```

assistant: ```c
int match(const char *mask, const char *string) {
  const char *m = mask, *s = string;
  char ch;
  const char *bm, *bs;
  while ((ch = *m++) && (ch != '*'))
    switch (ch) {
    case '\\':
      if (*m == '?' || *m == '*')
        ch = *m++;
    default:
      if (*s != ch)
        return 1;
    case '?':
      if (!*s++)
        return 1;
    };
  if (!ch)
    return *s;
got_star:
  bm = m;
  while ((ch = *m++))
    switch (ch) {
    case '?':
      if (!*s++)
        return 1;
    case '*':
      bm = m;
      continue;
    case '\\':
      if (*m == '?' || *m == '*')
        ch = *m++;
    default:
      goto break_while;
    };
break_while:
  if (!ch)
    return 0;
  while (*s++ != ch)
    if (!*s)
      return 1;
  bs = s;
  while ((ch = *m++)) {
    switch (ch) {
    case '*':
      goto got_star;
    case '\\':
      if (*m == '?' || *m == '*')
        ch = *m++;
    default:
      if (*s != ch) {
        m = bm;
        s = bs;
        goto got_star;
      };
    case '?':
      if (!*s++)
        return 1;
    };
  };
  if (*s) {
    m = bm;
    s = bs;
    goto got_star;
  };
  return 0;
}
```