user: 提供的汇编代码用C语言表示会是什么样子:

```asm
<fnmatch>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %edx,-0x54(%rbp)
  mov    -0x48(%rbp),%r12
  mov    -0x50(%rbp),%rbx
  jmp    L1079
L259:
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L458
  movsbl %r13b,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L458
  movsbl %r13b,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L252
L458:
  mov    %r13d,%eax
L252:
  mov    %eax,%r13d
  movsbl %r13b,%eax
  cmp    $0x5c,%eax
  je     L1077
  cmp    $0x5c,%eax
  jg     L1003
  cmp    $0x5b,%eax
  je     L242
  cmp    $0x5b,%eax
  jg     L1003
  cmp    $0x2a,%eax
  je     L824
  cmp    $0x3f,%eax
  jne    L1003
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L905
  mov    $0x1,%eax
  jmp    L1286
L905:
  mov    -0x54(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L632
  movzbl (%rbx),%eax
  cmp    $0x2f,%al
  jne    L632
  mov    $0x1,%eax
  jmp    L1286
L632:
  mov    -0x54(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L64
  movzbl (%rbx),%eax
  cmp    $0x2e,%al
  jne    L64
  cmp    -0x50(%rbp),%rbx
  je     L332
  mov    -0x54(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L64
  lea    -0x1(%rbx),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L64
L332:
  mov    $0x1,%eax
  jmp    L1286
L1077:
  mov    -0x54(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  jne    L569
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L724
  movsbl %r13b,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L724
  movsbl %r13b,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L578
L724:
  mov    %r13d,%eax
L578:
  mov    %eax,%r13d
L569:
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L1125
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L1125
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L221
L1125:
  movzbl (%rbx),%eax
  movsbl %al,%eax
L221:
  movsbl %r13b,%edx
  cmp    %edx,%eax
  je     L1163
  mov    $0x1,%eax
  jmp    L1286
L824:
  mov    -0x54(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L1255
  movzbl (%rbx),%eax
  cmp    $0x2e,%al
  jne    L1255
  cmp    -0x50(%rbp),%rbx
  je     L414
  mov    -0x54(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L1255
  lea    -0x1(%rbx),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L1255
L414:
  mov    $0x1,%eax
  jmp    L1286
L1255:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
  jmp    L513
L61:
  mov    -0x54(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L440
  movzbl (%rbx),%eax
  cmp    $0x2f,%al
  je     L29
L440:
  cmp    $0x3f,%r13b
  jne    L450
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L450
L29:
  mov    $0x1,%eax
  jmp    L1286
L450:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
  add    $0x1,%rbx
L513:
  cmp    $0x3f,%r13b
  je     L61
  cmp    $0x2a,%r13b
  je     L61
  test   %r13b,%r13b
  jne    L139
  mov    $0x0,%eax
  jmp    L1286
L139:
  mov    -0x54(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  jne    L1206
  cmp    $0x5c,%r13b
  jne    L1206
  movzbl (%r12),%eax
  jmp    L18
L1206:
  mov    %r13d,%eax
L18:
  mov    %al,-0x31(%rbp)
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L1256
  movsbl -0x31(%rbp),%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L1256
  movsbl -0x31(%rbp),%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L90
L1256:
  movzbl -0x31(%rbp),%eax
L90:
  mov    %al,-0x31(%rbp)
  sub    $0x1,%r12
  jmp    L796
L24:
  cmp    $0x5b,%r13b
  je     L124
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L447
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L447
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L62
L447:
  movzbl (%rbx),%eax
  movsbl %al,%eax
L62:
  movsbl -0x31(%rbp),%edx
  cmp    %edx,%eax
  jne    L77
L124:
  mov    -0x54(%rbp),%eax
  and    $0xfffffffb,%eax
  mov    %eax,%edx
  mov    %rbx,%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fnmatch>
  test   %eax,%eax
  jne    L77
  mov    $0x0,%eax
  jmp    L1286
L77:
  add    $0x1,%rbx
L796:
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L24
  mov    $0x1,%eax
  jmp    L1286
L242:
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L456
  mov    $0x1,%eax
  jmp    L1286
L456:
  mov    -0x54(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L1245
  movzbl (%rbx),%eax
  cmp    $0x2e,%al
  jne    L1245
  cmp    -0x50(%rbp),%rbx
  je     L1099
  mov    -0x54(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L1245
  lea    -0x1(%rbx),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L1245
L1099:
  mov    $0x1,%eax
  jmp    L1286
L1245:
  movzbl (%r12),%eax
  cmp    $0x21,%al
  je     L976
  movzbl (%r12),%eax
  cmp    $0x5e,%al
  jne    L1260
L976:
  mov    $0x1,%eax
  jmp    L1062
L1260:
  mov    $0x0,%eax
L1062:
  mov    %eax,%r15d
  test   %r15d,%r15d
  je     L1001
  add    $0x1,%r12
L1001:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
L466:
  mov    %r13b,-0x55(%rbp)
  mov    -0x54(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  jne    L563
  cmp    $0x5c,%r13b
  jne    L563
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r14d
  mov    %r14b,-0x55(%rbp)
L563:
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L388
  movzbl -0x55(%rbp),%r14d
  movsbl %r14b,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L388
  movsbl %r14b,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L1072
L388:
  movzbl -0x55(%rbp),%eax
L1072:
  mov    %eax,%r14d
  mov    %r14b,-0x55(%rbp)
  test   %r13b,%r13b
  jne    L152
  mov    $0x1,%eax
  jmp    L1286
L152:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L768
  movsbl %r13b,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L768
  movsbl %r13b,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L479
L768:
  mov    %r13d,%eax
L479:
  mov    %eax,%r13d
  mov    -0x54(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L831
  cmp    $0x2f,%r13b
  jne    L831
  mov    $0x1,%eax
  jmp    L1286
L831:
  cmp    $0x2d,%r13b
  jne    L120
  movzbl (%r12),%eax
  cmp    $0x5d,%al
  je     L120
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r14d
  mov    -0x54(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  jne    L358
  cmp    $0x5c,%r14b
  jne    L358
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r14d
L358:
  test   %r14b,%r14b
  jne    L1075
  mov    $0x1,%eax
  jmp    L1286
L1075:
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L839
  movsbl %r14b,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L839
  movsbl %r14b,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L3
L839:
  mov    %r14d,%eax
L3:
  mov    %eax,%r14d
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
L120:
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L129
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L129
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L481
L129:
  movzbl (%rbx),%eax
  movsbl %al,%eax
L481:
  movsbl -0x55(%rbp),%edx
  cmp    %edx,%eax
  jl     L611
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L150
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L150
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L1283
L150:
  movzbl (%rbx),%eax
  movsbl %al,%eax
L1283:
  movsbl %r14b,%edx
  cmp    %edx,%eax
  jle    L887
L611:
  cmp    $0x5d,%r13b
  je     L393
  jmp    L466
L393:
  nop
  test   %r15d,%r15d
  jne    L529
  mov    $0x1,%eax
  jmp    L1286
L887:
  nop
  jmp    L315
L519:
  test   %r13b,%r13b
  jne    L781
  mov    $0x1,%eax
  jmp    L1286
L781:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
  mov    -0x54(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  jne    L315
  cmp    $0x5c,%r13b
  jne    L315
  add    $0x1,%r12
L315:
  cmp    $0x5d,%r13b
  jne    L519
  test   %r15d,%r15d
  je     L1214
  mov    $0x1,%eax
  jmp    L1286
L1003:
  movsbl %r13b,%r13d
  mov    -0x54(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L687
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %eax,%eax
  je     L687
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  jmp    L876
L687:
  movzbl (%rbx),%eax
  movsbl %al,%eax
L876:
  cmp    %r13d,%eax
  je     L1219
  mov    $0x1,%eax
  jmp    L1286
L64:
  nop
  jmp    L1219
L1163:
  nop
  jmp    L1219
L529:
  nop
  jmp    L1219
L1214:
  nop
L1219:
  add    $0x1,%rbx
L1079:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%r13d
  test   %r13b,%r13b
  jne    L259
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L1280
  mov    $0x0,%eax
  jmp    L1286
L1280:
  mov    -0x54(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L945
  movzbl (%rbx),%eax
  cmp    $0x2f,%al
  jne    L945
  mov    $0x0,%eax
  jmp    L1286
L945:
  mov    $0x1,%eax
L1286:
  add    $0x38,%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
```

assistant: ```c
int fnmatch(pattern, string, flags) const char *pattern;
const char *string;
int flags;
{
  register const char *p = pattern, *n = string;
  register char c;
  while ((c = *p++) != '\0') {
    c = ((flags & (1 << 4)) && (1 && isupper(c)) ? tolower(c) : (c));
    switch (c) {
    case '?':
      if (*n == '\0')
        return 1;
      else if ((flags & (1 << 0)) && *n == '/')
        return 1;
      else if ((flags & (1 << 2)) && *n == '.' && (n == string || ((flags & (1 << 0)) && n[-1] == '/')))
        return 1;
      break;
    case '\\':
      if (!(flags & (1 << 1))) {
        c = *p++;
        c = ((flags & (1 << 4)) && (1 && isupper(c)) ? tolower(c) : (c));
      }
      if (((flags & (1 << 4)) && (1 && isupper(*n)) ? tolower(*n) : (*n)) != c)
        return 1;
      break;
    case '*':
      if ((flags & (1 << 2)) && *n == '.' && (n == string || ((flags & (1 << 0)) && n[-1] == '/')))
        return 1;
      for (c = *p++; c == '?' || c == '*'; c = *p++, ++n)
        if (((flags & (1 << 0)) && *n == '/') || (c == '?' && *n == '\0'))
          return 1;
      if (c == '\0')
        return 0;
      {
        char c1 = (!(flags & (1 << 1)) && c == '\\') ? *p : c;
        c1 = ((flags & (1 << 4)) && (1 && isupper(c1)) ? tolower(c1) : (c1));
        for (--p; *n != '\0'; ++n)
          if ((c == '[' || ((flags & (1 << 4)) && (1 && isupper(*n)) ? tolower(*n) : (*n)) == c1) && fnmatch(p, n, flags & ~(1 << 2)) == 0)
            return 0;
        return 1;
      }
    case '[': {
      register int not ;
      if (*n == '\0')
        return 1;
      if ((flags & (1 << 2)) && *n == '.' && (n == string || ((flags & (1 << 0)) && n[-1] == '/')))
        return 1;
      not = (*p == '!' || *p == '^');
      if (not )
        ++p;
      c = *p++;
      for (;;) {
        register char cstart = c, cend = c;
        if (!(flags & (1 << 1)) && c == '\\')
          cstart = cend = *p++;
        cstart = cend = ((flags & (1 << 4)) && (1 && isupper(cstart)) ? tolower(cstart) : (cstart));
        if (c == '\0')
          return 1;
        c = *p++;
        c = ((flags & (1 << 4)) && (1 && isupper(c)) ? tolower(c) : (c));
        if ((flags & (1 << 0)) && c == '/')
          return 1;
        if (c == '-' && *p != ']') {
          cend = *p++;
          if (!(flags & (1 << 1)) && cend == '\\')
            cend = *p++;
          if (cend == '\0')
            return 1;
          cend = ((flags & (1 << 4)) && (1 && isupper(cend)) ? tolower(cend) : (cend));
          c = *p++;
        }
        if (((flags & (1 << 4)) && (1 && isupper(*n)) ? tolower(*n) : (*n)) >= cstart && ((flags & (1 << 4)) && (1 && isupper(*n)) ? tolower(*n) : (*n)) <= cend)
          goto matched;
        if (c == ']')
          break;
      }
      if (!not )
        return 1;
      break;
    matched:;
      while (c != ']') {
        if (c == '\0')
          return 1;
        c = *p++;
        if (!(flags & (1 << 1)) && c == '\\')
          ++p;
      }
      if (not )
        return 1;
    } break;
    default:
      if (c != ((flags & (1 << 4)) && (1 && isupper(*n)) ? tolower(*n) : (*n)))
        return 1;
    }
    ++n;
  }
  if (*n == '\0')
    return 0;
  if ((flags & (1 << 3)) && *n == '/')
    return 0;
  return 1;
}
```