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    L154
  mov    %rsi,%rbp
  xor    %r13d,%r13d
  xor    %r14d,%r14d
  xor    %r15d,%r15d
  xor    %edx,%edx
  lea    D5(%rip),%rcx
  jmp    L35
  nopw   0x0(%rax,%rax,1)
L324:
  cmp    $0x3f,%ebx
  je     L289
  cmp    $0x5b,%ebx
  je     L109
  cmp    $0x5d,%ebx
  je     L21
  test   %bl,%bl
  js     L185
L115:
  cmp    $0x7c,%ebx
  je     L170
  mov    %r12,%rdi
  cmp    $0x29,%ebx
  je     L87
  nopl   0x0(%rax)
L8:
  add    $0x1,%rdi
  cmp    %rdi,%rbp
  jbe    L269
L35:
  cmpb   $0x7,(%rdi)
  jne    L8
  movzbl 0x1(%rdi),%ebx
  lea    0x1(%rdi),%r12
  mov    %ebx,%esi
  cmp    $0x2a,%bl
  jne    L324
L289:
  mov    %r12,%rdi
  mov    $0x1,%r14d
  add    $0x1,%rdi
  cmp    %rdi,%rbp
  ja     L35
L269:
  xor    $0x1,%r13d
  test   %edx,%edx
  sete   %r15b
  and    %r14d,%r13d
  and    %r13d,%r15d
L188:
  add    $0x18,%rsp
  mov    %r15d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L109:
  test   %r13d,%r13d
  jne    L166
  cmpb   $0x7,0x2(%rdi)
  je     L248
  mov    %r12,%rdi
  mov    $0x1,%r13d
  mov    $0x1,%r14d
  jmp    L8
  nopl   0x0(%rax,%rax,1)
L170:
  test   %r15d,%r15d
  je     L156
  nopl   0x0(%rax)
L166:
  mov    %r12,%rdi
  jmp    L8
  nopl   0x0(%rax,%rax,1)
L21:
  test   %r13d,%r13d
  je     L166
  test   %r15d,%r15d
  jne    L154
  xor    %r13d,%r13d
  mov    %r12,%rdi
  jmp    L8
  nopl   0x0(%rax)
L185:
  and    $0x7f,%esi
  mov    %rcx,%rdi
  mov    %edx,0xc(%rsp)
  call   <strchr@plt>
  mov    0xc(%rsp),%edx
  lea    D5(%rip),%rcx
  test   %rax,%rax
  je     L115
  test   %r13d,%r13d
  je     L213
  add    $0x1,%r15d
  mov    %r13d,%r14d
  mov    %r12,%rdi
  jmp    L8
  nopw   0x0(%rax,%rax,1)
L87:
  test   %r13d,%r13d
  je     L129
  lea    -0x1(%r15),%eax
  test   %r15d,%r15d
  je     L188
  mov    %eax,%r15d
  jmp    L8
  nopw   0x0(%rax,%rax,1)
L213:
  add    $0x1,%edx
  mov    %r12,%rdi
  mov    $0x1,%r14d
  jmp    L8
  nopl   0x0(%rax)
L156:
  test   %r13d,%r13d
  je     L166
L154:
  xor    %r15d,%r15d
  jmp    L188
L129:
  cmp    $0x1,%edx
  adc    $0xffffffff,%edx
  jmp    L8
  nopl   0x0(%rax)
L248:
  cmpb   $0x21,0x3(%rdi)
  je     L145
  mov    %r12,%rdi
L99:
  cmpb   $0x5d,0x2(%rdi)
  mov    $0x1,%r13d
  mov    $0x1,%r14d
  jne    L8
  add    $0x2,%rdi
  jmp    L8
L145:
  lea    0x3(%rdi),%rax
  cmpb   $0x7,0x4(%rdi)
  mov    %rax,%rdi
  je     L99
  mov    $0x1,%r13d
  mov    $0x1,%r14d
  jmp    L8
```

tool_calls: name: retrieve_data
arguments: tag: D5
type_guessed: string

tool: D5: *+?@! 

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