user: Demonstrate the C code that generates the assembly output below:

```asm
<match>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%r12
  mov    %rsi,%rbx
  movl   $0x1,-0x38(%rbp)
  movzbl (%rbx),%eax
  cmp    $0x5e,%al
  jne    L235
  movl   $0x0,-0x38(%rbp)
  add    $0x1,%rbx
L235:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%eax
  movsbl %al,%eax
  movzbl %al,%r13d
  mov    %rbx,%rax
  lea    0x1(%rax),%rbx
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x28(%rbp)
  cmpl   $0x5b,-0x28(%rbp)
  je     L216
  cmpl   $0x5b,-0x28(%rbp)
  jg     L1
  cmpl   $0x3f,-0x28(%rbp)
  je     L46
  cmpl   $0x3f,-0x28(%rbp)
  jg     L1
  cmpl   $0x0,-0x28(%rbp)
  je     L64
  cmpl   $0x2a,-0x28(%rbp)
  je     L154
L1:
  mov    -0x28(%rbp),%eax
  movzbl %al,%eax
  cmp    %eax,%r13d
  je     L145
  cmpl   $0x0,-0x38(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L62
L64:
  test   %r13d,%r13d
  je     L236
  cmpl   $0x0,-0x38(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L62
L236:
  mov    -0x38(%rbp),%eax
  jmp    L62
L46:
  test   %r13d,%r13d
  jne    L201
  cmpl   $0x0,-0x38(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L62
L154:
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L192
  mov    -0x38(%rbp),%eax
  jmp    L62
L192:
  sub    $0x1,%r12
  jmp    L120
L85:
  mov    %rbx,%rsi
  mov    %r12,%rdi
  call   <match>
  test   %eax,%eax
  je     L5
  mov    -0x38(%rbp),%eax
  jmp    L62
L5:
  add    $0x1,%r12
L120:
  movzbl (%r12),%eax
  test   %al,%al
  jne    L85
  cmpl   $0x0,-0x38(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L62
L216:
  movl   $0x7fff,-0x30(%rbp)
  movl   $0x1,-0x2c(%rbp)
  movzbl (%rbx),%eax
  cmp    $0x5e,%al
  jne    L350
  movl   $0x0,-0x2c(%rbp)
  add    $0x1,%rbx
L350:
  cmpl   $0x0,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x34(%rbp)
L6:
  mov    %rbx,%rax
  lea    0x1(%rax),%rbx
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x24(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jne    L351
  cmpl   $0x0,-0x38(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L62
L351:
  cmpl   $0x5d,-0x24(%rbp)
  je     L56
  cmpl   $0x2d,-0x24(%rbp)
  jne    L343
  cmp    %r13d,-0x30(%rbp)
  jg     L6
  mov    %rbx,%rax
  lea    0x1(%rax),%rbx
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,%r13d
  jg     L6
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  jmp    L6
L343:
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  cmp    %r13d,-0x30(%rbp)
  jne    L6
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  jmp    L6
L56:
  nop
  cmpl   $0x0,-0x34(%rbp)
  jne    L214
  cmpl   $0x0,-0x38(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L62
L145:
  nop
  jmp    L235
L201:
  nop
  jmp    L235
L214:
  nop
  jmp    L235
L62:
  add    $0x28,%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %rbp
  ret
```

assistant: ```c
int match(register char *s, register char *p) {
  register scc;
  int c, yes;
  yes = 1;
  if (*p == '^') {
    yes = 0;
    ++p;
  }
  for (;;) {
    scc = *s++ & 0377;
    switch (c = *p++) {
    default:
      if ((c & 0377) != scc)
        return (!yes);
      continue;
    case 0:
      return (scc == 0 ? yes : !yes);
    case '?':
      if (scc == 0)
        return (!yes);
      continue;
    case '*':
      if (!*p)
        return (yes);
      for (--s; *s; ++s)
        if (match(s, p))
          return (yes);
      return (!yes);
    case '[': {
      int ok, lc, good;
      lc = 077777;
      good = 1;
      if (*p == '^') {
        good = 0;
        ++p;
      }
      ok = !good;
      for (;;) {
        int cc;
        cc = *p++;
        if (cc == 0)
          return (!yes);
        if (cc == ']')
          break;
        if (cc == '-') {
          if (lc <= scc && scc <= *p++)
            ok = good;
        } else if (scc == (lc = cc))
          ok = good;
      }
      if (!ok)
        return (!yes);
      continue;
    }
    }
  }
}
```