user: 请将以下的汇编代码转换成C语言代码：

```asm
<ms_globmatch>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  jmp    L61
L62:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L383
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  je     L383
  mov    $0x0,%eax
  jmp    L100
L383:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x5c,-0x4(%rbp)
  je     L361
  cmpl   $0x5c,-0x4(%rbp)
  jg     L38
  cmpl   $0x5b,-0x4(%rbp)
  je     L593
  cmpl   $0x5b,-0x4(%rbp)
  jg     L38
  cmpl   $0x2a,-0x4(%rbp)
  je     L494
  cmpl   $0x3f,-0x4(%rbp)
  je     L237
  jmp    L38
L514:
  addq   $0x1,-0x20(%rbp)
L494:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  je     L514
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L78
  mov    $0x1,%eax
  jmp    L100
L78:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3f,%al
  je     L266
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5b,%al
  je     L266
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  je     L266
  jmp    L256
L333:
  addq   $0x1,-0x18(%rbp)
L256:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L266
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L333
  jmp    L266
L202:
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <ms_globmatch>
  test   %eax,%eax
  je     L422
  mov    $0x1,%eax
  jmp    L100
L422:
  addq   $0x1,-0x18(%rbp)
L266:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L202
  mov    $0x0,%eax
  jmp    L100
L237:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L525
  mov    $0x0,%eax
  jmp    L100
L593:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5e,%al
  je     L109
  movl   $0x0,-0xc(%rbp)
  jmp    L280
L109:
  movl   $0x1,-0xc(%rbp)
  addq   $0x1,-0x20(%rbp)
L280:
  movl   $0x0,-0x8(%rbp)
  jmp    L443
L615:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L360
  mov    $0x0,%eax
  jmp    L100
L360:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L446
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L591
  mov    $0x0,%eax
  jmp    L100
L591:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L588
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,-0x4(%rbp)
  je     L93
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L93
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,-0x4(%rbp)
  jge    L443
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jge    L443
L93:
  movl   $0x1,-0x8(%rbp)
  jmp    L443
L588:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,-0x4(%rbp)
  jg     L214
  movl   $0x1,-0x8(%rbp)
  jmp    L214
L446:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,-0x4(%rbp)
  jne    L314
  movl   $0x1,-0x8(%rbp)
L314:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L220
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L443
  movl   $0x1,-0x8(%rbp)
L443:
  cmpl   $0x0,-0x8(%rbp)
  jne    L345
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  jne    L615
  jmp    L345
L214:
  nop
  jmp    L345
L220:
  nop
L345:
  mov    -0xc(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jne    L273
  mov    $0x0,%eax
  jmp    L100
L167:
  addq   $0x1,-0x20(%rbp)
L273:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L257
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  jne    L167
L257:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  test   %al,%al
  jne    L384
  mov    $0x0,%eax
  jmp    L100
L361:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L38
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x4(%rbp)
L38:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,-0x4(%rbp)
  je     L516
  mov    $0x0,%eax
  jmp    L100
L525:
  nop
  jmp    L565
L384:
  nop
  jmp    L565
L516:
  nop
L565:
  addq   $0x1,-0x18(%rbp)
L61:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L62
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  sete   %al
  movzbl %al,%eax
L100:
  leave
  ret
```

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;
}
```