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

```asm
<has_globbing>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  cmp    %rsi,%rdi
  jae    L4
  mov    %rsi,%rbp
  mov    $0x0,%r14d
  movl   $0x0,0x8(%rsp)
  mov    $0x0,%r15d
  movl   $0x0,0xc(%rsp)
  mov    $0x1,%r13d
  jmp    L62
L274:
  test   %r14d,%r14d
  jne    L86
  cmpb   $0x7,0x2(%rdi)
  je     L106
L103:
  cmpb   $0x7,0x1(%r12)
  je     L350
  mov    %r12,%rdi
  mov    %r13d,%r14d
  mov    %r13d,0x8(%rsp)
  jmp    L111
L106:
  cmpb   $0x21,0x3(%rdi)
  jne    L103
  lea    0x3(%rdi),%r12
  jmp    L103
L350:
  cmpb   $0x5d,0x2(%r12)
  je     L7
  mov    %r12,%rdi
  mov    %r13d,%r14d
  mov    %r13d,0x8(%rsp)
  jmp    L111
L7:
  lea    0x2(%r12),%rdi
  mov    %r13d,%r14d
  mov    %r13d,0x8(%rsp)
  jmp    L111
L24:
  test   %r14d,%r14d
  je     L109
  test   %r15d,%r15d
  jne    L240
  mov    %r15d,%r14d
  mov    %r12,%rdi
  jmp    L111
L272:
  and    $0x7f,%esi
  lea    D7(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L288
  test   %r14d,%r14d
  je     L194
  add    $0x1,%r15d
  mov    %r14d,0x8(%rsp)
  mov    %r12,%rdi
  jmp    L111
L194:
  addl   $0x1,0xc(%rsp)
  mov    %r12,%rdi
  mov    %r13d,0x8(%rsp)
  jmp    L111
L48:
  test   %r14d,%r14d
  je     L292
  test   %r15d,%r15d
  je     L264
L292:
  mov    %r12,%rdi
  jmp    L111
L377:
  mov    0xc(%rsp),%eax
  test   %eax,%eax
  je     L154
  sub    $0x1,%eax
  mov    %eax,0xc(%rsp)
  jmp    L111
L139:
  mov    %r12,%rdi
  mov    %r13d,0x8(%rsp)
L111:
  add    $0x1,%rdi
  cmp    %rdi,%rbp
  jbe    L237
L62:
  cmpb   $0x7,(%rdi)
  jne    L111
  lea    0x1(%rdi),%r12
  movzbl 0x1(%rdi),%esi
  movzbl %sil,%ebx
  cmp    $0x3f,%sil
  je     L139
  cmp    $0x2a,%ebx
  je     L139
  cmp    $0x5b,%ebx
  je     L274
  cmp    $0x5d,%ebx
  je     L24
  test   %sil,%sil
  js     L272
L288:
  cmp    $0x7c,%ebx
  je     L48
  mov    %r12,%rdi
  cmp    $0x29,%ebx
  jne    L111
  test   %r14d,%r14d
  je     L377
  lea    -0x1(%r15),%eax
  test   %r15d,%r15d
  je     L368
  mov    %eax,%r15d
  jmp    L111
L86:
  mov    %r12,%rdi
  jmp    L111
L109:
  mov    %r12,%rdi
  jmp    L111
L154:
  mov    0xc(%rsp),%r14d
  jmp    L111
L4:
  mov    $0x0,%r14d
  movl   $0x0,0x8(%rsp)
  movl   $0x0,0xc(%rsp)
L237:
  or     0xc(%rsp),%r14d
  sete   %al
  cmpl   $0x0,0x8(%rsp)
  setne  %r15b
  movzbl %r15b,%r15d
  and    %eax,%r15d
L368:
  mov    %r15d,%eax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L240:
  mov    $0x0,%r15d
  jmp    L368
L264:
  mov    $0x0,%r15d
  jmp    L368
```

tool_calls: name: read_data
arguments: data_tag: D7
type: string

tool: D7: *+?@! 

assistant: ```c
int has_globbing(xp, xpe) const char *xp, *xpe;
{
  const unsigned char *p = (const unsigned char *)xp;
  const unsigned char *pe = (const unsigned char *)xpe;
  int c;
  int nest = 0, bnest = 0;
  int saw_glob = 0;
  int in_bracket = 0;
  for (; p < pe; p++) {
    if (!((unsigned char)(*p) == (7)))
      continue;
    if ((c = *++p) == '*' || c == '?')
      saw_glob = 1;
    else if (c == '[') {
      if (!in_bracket) {
        saw_glob = 1;
        in_bracket = 1;
        if (((unsigned char)(p[1]) == (7)) && p[2] == '!')
          p += 2;
        if (((unsigned char)(p[1]) == (7)) && p[2] == ']')
          p += 2;
      }
    } else if (c == ']') {
      if (in_bracket) {
        if (bnest)
          return 0;
        in_bracket = 0;
      }
    } else if ((c & 0x80) && strchr("*+?@! ", c & 0x7f)) {
      saw_glob = 1;
      if (in_bracket)
        bnest++;
      else
        nest++;
    } else if (c == '|') {
      if (in_bracket && !bnest)
        return 0;
    } else if (c == ')') {
      if (in_bracket) {
        if (!bnest--)
          return 0;
      } else if (nest)
        nest--;
    }
  }
  return saw_glob && !in_bracket && !nest;
}
```