user: 这段汇编代码用C语言表示是什么样的：

```asm
<ms_globmatch>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L419
  mov    $0x0,%edi
  mov    $0x1,%r8d
  mov    $0x5c,%r9d
  jmp    L101
L33:
  cmp    $0x5c,%al
  jne    L366
  movzbl 0x1(%rsi),%eax
  test   %al,%al
  je     L149
  add    $0x2,%rsi
  movsbl %al,%eax
  jmp    L304
L366:
  movsbl %al,%eax
  mov    %rbx,%rsi
L304:
  movsbl %dl,%edx
  cmp    %eax,%edx
  jne    L46
L62:
  add    $0x1,%rbp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L419
L101:
  movzbl 0x0(%rbp),%edx
  cmp    $0x2a,%al
  je     L122
  test   %dl,%dl
  je     L28
L122:
  lea    0x1(%rsi),%rbx
  cmp    $0x5b,%al
  je     L178
  jg     L33
  cmp    $0x2a,%al
  je     L151
  cmp    $0x3f,%al
  jne    L366
  test   %dl,%dl
  je     L194
  mov    %rbx,%rsi
  jmp    L62
L151:
  movzbl 0x1(%rsi),%ecx
  cmp    $0x2a,%cl
  jne    L620
L462:
  add    $0x1,%rbx
  movzbl (%rbx),%ecx
  cmp    $0x2a,%cl
  je     L462
L620:
  mov    $0x1,%eax
  test   %cl,%cl
  je     L147
  lea    -0x5b(%rcx),%eax
  cmp    $0x1,%al
  jbe    L233
  cmp    $0x3f,%cl
  jne    L23
L233:
  mov    $0x0,%eax
  cmpb   $0x0,0x0(%rbp)
  jne    L197
  jmp    L147
L23:
  cmp    %cl,%dl
  je     L233
  test   %dl,%dl
  je     L233
L223:
  add    $0x1,%rbp
  movzbl 0x0(%rbp),%eax
  cmp    %cl,%al
  je     L233
  test   %al,%al
  jne    L223
  jmp    L233
L29:
  add    $0x1,%rbp
  cmpb   $0x0,0x0(%rbp)
  je     L147
L197:
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <ms_globmatch>
  test   %eax,%eax
  je     L29
  mov    $0x1,%eax
  jmp    L147
L194:
  mov    $0x0,%eax
  jmp    L147
L178:
  mov    %edi,%r11d
  cmpb   $0x5e,0x1(%rsi)
  jne    L352
  lea    0x2(%rsi),%rbx
  mov    %r8d,%r11d
  jmp    L352
L269:
  lea    0x2(%rbx),%rsi
  movzbl 0x2(%rbx),%eax
  test   %al,%al
  je     L126
  cmp    $0x5d,%al
  je     L67
  cmp    %al,%dl
  je     L317
  cmp    %cl,%dl
  je     L317
  cmp    %al,%dl
  jge    L189
  cmp    %cl,%dl
  jg     L527
L189:
  mov    %rsi,%rbx
L352:
  lea    0x1(%rbx),%rsi
  movzbl (%rbx),%ecx
  test   %cl,%cl
  je     L258
  movzbl 0x1(%rbx),%eax
  test   %al,%al
  je     L347
  cmp    $0x2d,%al
  je     L269
  cmp    %cl,%dl
  sete   %r10b
  movzbl %r10b,%r10d
  cmp    $0x5d,%al
  je     L115
  cmp    %al,%dl
  je     L48
  cmp    %cl,%dl
  jne    L189
  mov    %r8d,%r10d
  jmp    L115
L67:
  cmp    %cl,%dl
  setge  %r10b
  movzbl %r10b,%r10d
  jmp    L115
L258:
  mov    %edi,%r10d
L115:
  cmp    %r10d,%r11d
  je     L490
  movzbl (%rsi),%eax
  test   %al,%al
  je     L443
  cmp    $0x5d,%al
  je     L443
L470:
  add    $0x1,%rsi
  movzbl (%rsi),%eax
  test   %al,%al
  je     L443
  cmp    $0x5d,%al
  jne    L470
L443:
  add    $0x1,%rsi
  test   %al,%al
  jne    L62
  mov    $0x0,%eax
  jmp    L147
L317:
  mov    %r8d,%r10d
  jmp    L115
L527:
  mov    %r8d,%r10d
  jmp    L115
L48:
  mov    %r8d,%r10d
  jmp    L115
L149:
  mov    %rbx,%rsi
  mov    %r9d,%eax
  jmp    L304
L419:
  cmpb   $0x0,0x0(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L147
L28:
  mov    $0x0,%eax
  jmp    L147
L347:
  mov    $0x0,%eax
L147:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
L126:
  mov    $0x0,%eax
  jmp    L147
L490:
  mov    $0x0,%eax
  jmp    L147
L46:
  mov    $0x0,%eax
  jmp    L147
```

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